0

私はプログラムをデバッグしていましたが、同期を2つの異なる方法で配置することでバグを解決しました。奇妙なことに、それ以前はロックを使用していましたが、成功しませんでした。

public void method()    
{
    lock.lock(); //lock
    if(nReaders > 0){

    readers.await(); }//await

    nReaders++;



    ...


    nReaders--;

    readers.signal(); //signal
    lock.unlock(); //lock
}

これはこれと同等だと思った

public synchronized void method(){}

残念ながら、そうではないようです...ここで何が欠けていますか?

4

1 に答える 1

2

1 つは具体的な Lock オブジェクトをロックし、もう 1 つは をロックしますthis。特にロック オブジェクトがこのクラスのすべてのインスタンスで同じである場合、これは大きな違いです。このオブジェクトのインスタンスが複数ある場合、各インスタンスはそれ自体でロックされますが、これは望ましくない場合があります。

于 2013-10-18T03:43:41.110 に答える