次の使用例があります: m1 と m2 の 2 つのメソッドを持つクラスがあります。通常、m1() は同期する必要はありませんが、誰かが m2() を呼び出した場合、m2() が実行されている限り、m1() を同期する必要があります。これを実現するために、次のコードを思いつきました。よろしいですか?それにコメントして、より良いオプションを提案しますか?
注: この状況は実用的ではないことを認識しています。たとえば、あるスレッドが m1 の途中にあり、他のスレッドが m2 を呼び出している場合、問題が発生するためです (誰かが対処方法を指摘してくれると助かります)。それ); それにもかかわらず、私はこれについて考えるのが面白いと感じました。
public class DynamicSync
{
volatile MyLock lock;
private final MyLock DUMMY_LOCK = new DummyMyLock();
private final MyLock SYNCHRONIZED_LOCK = new SynchronizedMyLock();
public DynamicSync()
{
lock = DUMMY_LOCK;
}
public void dynamicallySynchronizedMethod() // this is method m1() in the question above
{
lock.lock();
// some logic
lock.unlock();
}
public void setLockAndExecuteLogic() // this is method m2() in the question above
{
synchronized(SYNCHRONIZED_LOCK)
{
lock = SYNCHRONIZED_LOCK;
// some logic
}
}
interface MyLock
{
void lock();
void unlock();
}
class DummyMyLock implements MyLock
{
@Override
public void lock()
{
}
@Override
public void unlock()
{
}
}
class SynchronizedMyLock implements MyLock
{
@Override
public synchronized void lock()
{
// no op
}
@Override
public void unlock()
{
lock = DUMMY_LOCK;
}
}
}
編集:実際の問題は次のとおりです。私はオブジェクトプールを設計しています。ここでは、いくつのオブジェクトが割り当てられ、どのオブジェクトが残っているかを知る必要があります。そのため、2 つのコレクションを維持することを考えていました。origSet はすべてのオブジェクトを含む HashSet であり、dynaSet は ConcurrentSkipListSet であり、そこからオブジェクトを取り出して元に戻します。origSet と dynaSet の違いを理解する必要がある場合瞬時に、差が計算されるまで dyanSet を「フリーズ」する必要があります。しかし、この違いを取得することは非常にまれな操作になるため、私の質問です。