Để 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; } } } |