メソッドのパラメータに応じて、Java同期

theFriedC:

どのように私は、メソッドのパラメータ値に同期を提供することができますか?

「同じ」パラメータ値Aを使用するすべてのメソッド呼び出しは同期する必要があります。異なるパラメータ値例えばBを持つメソッドの呼び出しは、Aとの通話がすでに待っている場合でも、アクセスすることができます。Bについては、次の同時通話が解放された最初のBのためにも待たなければなりません。

私の使用の場合:私はしたい同期JPAエンティティへのアクセスを IDレベルではなく、私は一種キューの必要があるため、悲観的ロックを回避したいです。キーロックのためには、」であることを意図しているエンティティのIDタイプのJavaロングの事実です- 。

protected void entityLockedAccess(SomeEntity myEntity) {
    //getId() returns different Long objects so the lock does not work
    synchronized (myEntity.getId()) {
        //the critical section ...
    }
}

私は、ロックオブジェクトについて読んしかし、私は彼らが私の場合には合うだろうかわかりません。トップレベルでは、私は重要なコードを実行し、私のアプリケーションに固有のREST呼び出しを管理したいです。

おかげで、クリス

ベン:

限り私はあなたが基本的にあなたのそれぞれに異なる、ユニークなロックたい理解されるようにSomeEntityIDを。

あなたはでこれを実現することができMap<Integer, Object>

あなたは、単にオブジェクトに各IDをマップします。すでにオブジェクトがあるはずです、あなたはそれを再利用します。これは、このような何かを見ることができます。

static Map<Integer, Object> locks = new ConcurrentHashMap<>();

public static void main(String[] args)
{
    int i1 = 1;
    int i2 = 2;

    foo(i1);
    foo(i1);
    foo(i2);
}

public static void foo(int o)
{
    synchronized (locks.computeIfAbsent(o, k -> new Object()))
    {
        // computation
    }
}

これはのためのオブジェクトとしてマップに2つのロックオブジェクトを作成します。i1第二に再利用されるfoo(i1)コール。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=197850&siteId=1