【发布时间】:2011-10-06 21:40:54
【问题描述】:
鉴于,在 ArrayList 中添加方法定义如下:-
public boolean add(E e) {
ensureCapacity(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
请查找以下程序来检查 ArrayList 的线程安全性。
package pack4;
import java.util.ArrayList;
public class Demo {
public static void main(String[] args) {
ArrayList<String> al = new ArrayList<String>() ;
new AddFirstElementThread(al).start() ;
new RemoveFirstElementThread(al).start() ;
}
}
class AddFirstElementThread extends Thread{
ArrayList<String> list ;
public AddFirstElementThread(ArrayList<String> l) {
list = l ;
}
@Override
public void run() {
while(true){
if(list.size() == 0){
list.add("First element") ;
}
}
}
}
class RemoveFirstElementThread extends Thread{
ArrayList<String> list ;
public RemoveFirstElementThread(ArrayList<String> l) {
list = l ;
}
@Override
public void run() {
while(true){
if(list.isEmpty()){
try{
list.get(0) ;
System.out.println("Hence Proved, that ArrayList is not Thread-safe.");
System.exit(1) ;
}catch (Exception e) {
//continue, if no value is there at index 0
}
}
}
}
}
但是,程序永远不会终止,因此无法证明 ArrayList 的线程安全性。
请建议正确的实现来测试 ArrayList 和 Vector 的线程安全行为。
感谢和最好的问候,
Rits
【问题讨论】:
-
嗯,事情是这样的。
ArrayList不是线程安全的,所以你将无法首先测试它。 -
当然这种情况永远不会终止,你没有终止条件。如果你正在编写一个测试用例,你应该有一些终止条件。两个线程永远运行,就像你在每个线程中都有 while(true){ do stuff } 一样。
-
@Milhous : RemoveFirstElementThread 的运行方法中存在终止条件...
-
只有在 RemoveFirstElement 线程第一次进入调用时列表为空时才会终止。否则它将永远运行。
标签: java multithreading collections thread-safety arraylist