2011-09-11 23 views

答えて

2

もちろん、簡単ではありません。

Freeman & Pryceの"Growing Object Oriented Software"本でこのトピックに関する優れた章がありますが、これは私が強くお勧めします。

2

私はこれを実際に行ったことがありますが、単純なマルチスレッドのシナリオの場合に限ります。基本的に、あなたが望むのは、複数のスレッドのアクセスをハッシュマップに同期させることです。言い換えれば、ハッシュマップ上のスレッドの束が予測可能な順序になるようにすることです。それぞれのスレッドが何かを実行するたびに、各スレッドがナノタイムといくつかの一意のIDにログインし、これらのログエントリに対してアサーションを持つテストケースを構築することができます(memroyに保持することができます。実際のファイル)が正しい順序であるかどうかをチェックします。

はここでどのようにユニットテスト、複数の彼らは、私は彼らがそれを行うことを期待するためにそれを行うことを確認するために、データベースにアクセスするスレッド(だけでなく、実際に、それはちょうど2です)の例です:

@Test 
public void testPessimisticLock3_write_blocking() throws Throwable { 
    init(); 
    final ArrayList<String> eventsOrder = new ArrayList<String>(); 
    Department d = new Department(); 

    d.setName("d"); 

    em.getTransaction().begin(); 
    em.persist(d); 
    em.getTransaction().commit(); 

    id=d.getId(); 

    em.getTransaction().begin(); 
    //aquire lock: 
    @SuppressWarnings("unused") 
    Department dRet1 = em.find(Department.class, d.getId(),LockModeType.PESSIMISTIC_WRITE); 
    eventsOrder.add("First transaction got the lock"); 

// dRet1.setName( "dRet1");

eventsOrder.add("First transaction will sleep for a while..."); 
    Thread.sleep(1500); 

    new Thread(new Runnable() { 

     @Override 
     public void run() { 
      em2.getTransaction().begin(); 
      //this will wait for the first transaction to release the lock, so that this 2nd transaction can acquire the lock 
      eventsOrder.add("Second transaction will now try to get the lock..."); 
      em2.find(Department.class, id,LockModeType.PESSIMISTIC_WRITE); 
      eventsOrder.add("Second transaction got the lock."); 
      em2.getTransaction().commit(); 

      assertEquals("First transaction got the lock",eventsOrder.get(0)); 
      assertEquals("First transaction will sleep for a while...",eventsOrder.get(1)); 
      assertEquals("Second transaction will now try to get the lock...",eventsOrder.get(2)); 
      assertEquals("First transaction woke up and will commit...",eventsOrder.get(3)); 
      assertEquals("First transaction has commited.",eventsOrder.get(4)); 
      assertEquals("Second transaction got the lock.",eventsOrder.get(5)); 
     } 
    }).start(); 

    Thread.sleep(1500); 
    eventsOrder.add("First transaction woke up and will commit..."); 
    em.getTransaction().commit(); 
    eventsOrder.add("First transaction has commited."); 


} 
関連する問題