2013-08-28 2 views

答えて

0

いいえ、動作に違いはありません。しかし、ウェブサイトによれば、​​の代わりにReentrantLockを使用する場合があります。

  1. スレッドが適切に選択されるのを待ちます。
  2. tryLock()メソッドを使用します。
  3. 待機中のスレッドを中断して、何か他のことをしたいとします。
  4. ReentrantLockのパフォーマンスは同期よりも優れています。

これらの改善が必要ない場合は、​​を使用すると問題が解決しない場合があります。 the JavaDoc of the ReetrantLock classから

2

リエントラント相互排他Lock同じ基本的な動作と セマンティクスを持つ暗黙の監視ロックなどはなく、拡張された機能を持つ、​​ メソッドや文を使用してアクセス。

この例では、「拡張機能」は使用しません。​​メソッドと同等の代替手段としてReentrantLockを使用します(ただし、​​ステートメントでは、ロックとしてthisを使用します)。したがって、2つのメソッドは同じように動作する必要があります。

+0

これは、有用な「ReentrantReadWriteLock'''です。それは ''同期 ''で実装するのは面倒です。 –

6

ここには、ロックにアクセスするスレッドとロックを解除するスレッドの3つの方法があります。​​キーワードを使用してこれらを実装してみてください。 ReentrantLockを使用することの拡張機能と利点が明らかになります。

public class DoorLockUsingLock { 

    private int counter= 0; 
    private Thread owner= null; 
    private Lock l = new ReentrantLock(); 
    private Condition notLocked= l.newCondition(); 

    public void lockItDown() throws InterruptedException { 
     l.lockInterruptibly(); 
     try { 
      while ((counter> 0) && (owner!= Thread.currentThread())) { 
       notLocked.await(); 
      } 
      counter++; 
      owner = Thread.currentThread(); 
     } finally { 
      l.unlock(); 
     } 
    } 

    public void lockItDownUninterruptibly() { 
     l.lock(); 
     try { 
      while ((counter > 0) && (owner != Thread.currentThread())) { 
       notLocked.awaitUninterruptibly(); 
      } 
      counter++; 
      owner= Thread.currentThread(); 
     } finally { 
      l.unlock(); 
     } 
    } 

    public boolean tryLockItDown(long timeout, TimeUnit unit) throws InterruptedException { 
     long time = unit.toNanos(timeout); 
     long end = System.nanoTime() + time; 
     boolean success = l.tryLock(timeout, unit); 
     if (!success) { 
      return false; 
     } 
     try { 
      time = end- System.nanoTime(); 
      while ((counter> 0) && (owner != Thread.currentThread()) && (time > 0)) { 
       notLocked.await(time, TimeUnit.NANOSECONDS); 
       time = end - System.nanoTime(); 
      } 
      if (time > 0) { 
       counter++; 
       owner = Thread.currentThread(); 
       return true; 
      } 
      return false; 
     } finally { 
      l.unlock(); 
     } 
    } 

    public void unlockIt() throws IllegalMonitorStateException { 
     l.lock(); 
     try { 
      if (counter== 0) { 
       throw new IllegalMonitorStateException(); 
      } 
      if (owner!= Thread.currentThread()) { 
       throw new IllegalMonitorStateException(); 
      } 
      counter--; 
      if (counter == 0) { 
       owner = null; 
       notLocked.signal(); 
      } 
     } finally { 
      l.unlock(); 
     } 
    } 
} 
+2

これは、基本的に ''同期 ''、 ''待機 ''、 '' '通知する' 'の動作を再現します。 '' 'ReentrantLock''と' 'Condition''はセマンティクスをクリーンアップし、公平さを許容しますが、それ以外はほとんど同じです。 –

関連する問題