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呼び出しを管理したいです。
おかげで、クリス
ベン:
限り私はあなたが基本的にあなたのそれぞれに異なる、ユニークなロックたい理解されるようにSomeEntity
IDを。
あなたはでこれを実現することができ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)
コール。