Để tránh việc nhiều thread sử dụng một phương thức tại một thời điểm, chúng ta thường khai báo phương thức sử dụng keyword synchronized của Java, ví dụ như sau:
1
2
3
4
5
6
7
8
package
com
.
huongdanjava
.
lombok
;
public
class
Example
{
public
synchronized
int
calculate
(
int
a
,
int
b
)
{
return
a
+
b
;
}
}
Project Lombok cũng cung cấp một cách an toàn hơn để làm điều này bằng cách sử dụng annotation @Synchronized.
1
2
3
4
5
6
7
8
9
10
11
package
com
.
huongdanjava
.
lombok
;
import
lombok
.
Synchronized
;
public
class
Example
{
@Synchronized
public
int
calculate
(
int
a
,
int
b
)
{
return
a
+
b
;
}
}
Với annotation này, Lombok sẽ generate một private field tên là $lock cho phương thức nonstatic và một private field tên là $LOCK cho phương thức static. Điều này sẽ an toàn hơn bởi vì nó sẽ cho phép chúng ta lock phương thức sử dụng một instance field thay vì chính phương thức đó.
Nếu các bạn kiểm tra tập tin Example.class nằm trong thư mục /target/classes/com/huongdanjava/lombok, các bạn sẽ thấy nội dung của class Example được generate như sau:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package
com
.
huongdanjava
.
lombok
;
public
class
Example
{
private
final
Object
$
lock
=
new
Object
[
0
]
;
public
Example
(
)
{
}
public
int
calculate
(
int
a
,
int
b
)
{
Object
var3
=
this
.
$
lock
;
synchronized
(
this
.
$
lock
)
{
return
a
+
b
;
}
}
}