Lombokの@Synchronized(lombok.Synchronized)アノテーションの利用サンプルです
@Synchronized
をメソッドに付与すると自動生成されたロックオブジェクトでsynchronizedブロックが生成された状態になります。
@Synchronized
を利用すると以下を省略することができるので、実処理を邪魔せずにコードを書くことができると個人的に思います。
- synchronizedのためにコードブロックを1段下げる
- synchronized用のロックオブジェクトをメンバに保持する
■@Synchronizedを付与したクラス
import lombok.Synchronized; public class BusinessLogic1 { private final Object lockObj = new Object(); @Synchronized public static void staticLogic(String param) { System.out.println(param); } // @Synchronized の付与なし public void logic0(String param) { System.out.println(param); } @Synchronized public void logic1(String param) { System.out.println(param); } @Synchronized public void logic2(String param) { System.out.println(param); } // ロックオブジェクトを明示的に指定することもできる @Synchronized("lockObj") public void logic3(String param) { System.out.println(param); } // ロックオブジェクトを明示的に指定することもできる @Synchronized("lockObj") public void logic4(String param) { System.out.println(param); } }
■実際に生成されているソースコード
実際に生成されているソースコードをdelombokを使って確認してみました。
ロックオブジェクトが自動的に作成され、そのオブジェクトで各メソッドのsynchronizedブロックが生成されていることが分かります。
また、staticメソッドと非staticメソッドで利用されるロックオブジェクトが異なることもわかります。
public class BusinessLogic1 { private static final Object $LOCK = new Object[0]; private final Object $lock = new Object[0]; private final Object lockObj = new Object(); public static void staticLogic(String param) { synchronized (BusinessLogic1.$LOCK) { System.out.println(param); } } public void logic0(String param) { System.out.println(param); } public void logic1(String param) { synchronized (this.$lock) { System.out.println(param); } } public void logic2(String param) { synchronized (this.$lock) { System.out.println(param); } } public void logic3(String param) { synchronized (this.lockObj) { System.out.println(param); } } public void logic4(String param) { synchronized (this.lockObj) { System.out.println(param); } } }