覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

Lombok - @Synchronized

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);
        }
    }
}



関連エントリ