下面的程序有问题,根本没法测试线程安全性,我留在这里,以此作为反面教材,大家不要看了。下面的程序是取出后在进行赋值,集合的隔离级别防不住这个,所以是下面的程序有问题,不过我也没想到好办法来测试这个线程不安全。
没有使用Collections.synchronizedSortedSet()进行包装的HashSet的程序
import java.util.*;
public class CollectionTest2
{
public static void main(String[] args)
{
HashSet<Integer> set = new HashSet<Integer>();
set.add(0);
System.out.println(set);
AddNumThread ant = new AddNumThread(set);
ant.start();
AddNumThread ant2 = new AddNumThread(set);
ant2.start();
}
}
class AddNumThread extends Thread
{
HashSet<Integer> set;
public AddNumThread(HashSet<Integer> set)
{
this.set = set;
}
@Override
public void run()
{
for(int i = 0; i < 5; i++)
{
int n = (int) set.toArray()[0];
set.clear();
set.add(n+1);
System.out.println(set);
}
}
}
执行结果如下 从上面的结果可以看出,一个程序会出现两个结果,这就是线程不安全, 大错特错 把上面程序的HashSet用Collections.synchronizedSortedSet()抱起来后,执行结果如下:
|