次の使用例があります: 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 を「フリーズ」する必要があります。しかし、この違いを取得することは非常にまれな操作になるため、私の質問です。