在Java中测试两个同步方法

时间:2015-11-19 08:17:47

标签: java multithreading

所以我有一个列表和两个线程。一种是向列表中添加值并等待列表变空,另一种是删除值。代码如下所示:

public void addValueToList(String value) {
    list.add(value);
    waitForListToGetEmpty();
}

private synchronized waitForListToGetEmpty() {
    while ( !this.list.isEmpty() ) {
         try  {
            this.wait();
         }  catch ( final InterruptedException e ) { }
      }
}

private synchronized removeValueFromList(int index) {
    this.list.remove(index);
    if (this.list.isEmpty()) {
         this.notify();
    }
}

我的问题是测试上面的代码。我尝试过这样的事情:

public void testAddValueToList() {
     Thread addValueThread = new Thread( new Runnable() {
         public void run() {
            addValueToList("new value");
         }
      }
      addValueThread.start();
}

public void testRemoveValueFromList() {
    Thread removeValueThread = new Thread( new Runnable() {
         public void run() {
            removeValueFromList(0);
         }
      }
    removeValueThread.start();
}

问题在于两个测试成功运行,但似乎第一个run我称之为addValueToList的问题永远不会被解决。任何人都可以帮我一些想法来测试这个吗?

1 个答案:

答案 0 :(得分:0)

想象一下,如果addValueThread先运行并将avalue添加到列表但在调用waitForListToGetEmpty()之前,JVM会启动removeValueThread并在抓取锁定的过程中调用removeValueFromList()最终在notify()addValueThread阻止之前致电wait()

同步您的addValueToList(),以便addValueThread立即获取锁定,removeValueFromList()如果先removeValueThread先运行,$("#Mycarousel").carousel('next'); 也会抛出异常