2016-04-08 4 views
1

私は2つの方法があり、どちらも別のスレッドで実行されています。もう一方が呼び出されたときに実行したいメソッドの1つです。この私が次の実装ReentrantLock - 有効なアプローチですか?

@Override 
public void doSomethingElse(int param) 
{ 
    lock.lock(); 
    for (int i = 0 ; i < param; i++) 
    { 
     //do some stuff 
    } 
    lock.unlock(); 
} 

を持って、私は私の他の方法で

@Override 
public synchronized void doSomething(int[] params) 
{ 
    while (lock.isLocked()) 
    { 
     // wait for it to become unlocked 
    } 

    //lock is released so lets do some stuff 

ロックを使用することを選択した理由であることは、whileループは、私はこのスレッドが待機したい、と言うための正しい方法ですここでのロックは、この

おかげ

答えて

2

whileループは間違いなくあなたがワンない何かであるビジーウェイトを行い実施するためのより良い方法をリリースかありさまで、やりたい lock.lock();を呼び出すと、ロックが解除されるまでブロックされるので、他の方法と同じように、ロックを解除するのが適切な方法です。

また、最初の方法が​​である必要はなく、ロックは常にfinally句で解放する必要があります。

private void method1() 
{ 
    lock.lock(); 
    try { 
     ... 
    } finally { 
     lock.unlock(); 
    } 
} 

private void method2() 
{ 
    lock.lock(); 
    try { 
     ... 
    } finally { 
     lock.unlock(); 
    } 
} 

が最終的に{}またはあなたがデッドロックに終わる可能性を試して{}を使用しないでくださいforgeet:

2

あなたはこのようなものが必要。

0

どちらも間違っていますが、標準的な方法はfinally節でロックを解除することです。そうでなければ、ロックが適用されるコードの内部から例外がスローされた場合、アプリケーションは停止します。

public void doSomethingElse(int param) throws Exception { 
    lock.lock(); 
    try { 
     //do some stuff that may throw exceptions 
    } finally { 
     lock.unlock(); 
    } 
} 
関連する問題