Java で同期された静的メソッドはどのように機能し、Hibernate エンティティのロードに使用できますか? 質問する

Java で同期された静的メソッドはどのように機能し、Hibernate エンティティのロードに使用できますか? 質問する

基本的なデータ アクセスを実現するために Hibernate 関数を呼び出す静的メソッドを持つユーティリティ クラスがある場合、そのメソッドを作成することがsynchronizedスレッドの安全性を確保するための適切なアプローチであるかどうか疑問に思っています。

同じ DB インスタンスへの情報へのアクセスを防止したいのですが、特定のクラスによって呼び出されたときに、次のコードがすべてのクラスに対して呼び出されるのを防止しているかどうかは、今では確信していますgetObjectById

public class Utils {
     public static synchronized Object getObjectById (Class objclass, Long id) {
           // call hibernate class
         Session session = new Configuration().configure().buildSessionFactory().openSession();
         Object obj = session.load(objclass, id);
         session.close();
         return obj;
     }

     // other static methods
}

ベストアンサー1

より一般的に質問にお答えすると...

メソッドで synchronized を使用するのは単なる省略形であることに注意してください (クラスが であると仮定SomeClass)。

synchronized static void foo() {
    ...
}

と同じです

static void foo() {
    synchronized(SomeClass.class) {
        ...
    }
}

そして

synchronized void foo() {
    ...
}

と同じです

void foo() {
    synchronized(this) {
        ...
    }
}

ロックには任意のオブジェクトを使用できます。静的メソッドのサブセットをロックしたい場合は、

class SomeClass {
    private static final Object LOCK_1 = new Object() {};
    private static final Object LOCK_2 = new Object() {};
    static void foo() {
        synchronized(LOCK_1) {...}
    }
    static void fee() {
        synchronized(LOCK_1) {...}
    }
    static void fie() {
        synchronized(LOCK_2) {...}
    }
    static void fo() {
        synchronized(LOCK_2) {...}
    }
}

(非静的メソッドの場合、ロックを非静的フィールドにする必要があります)

おすすめ記事