下面的程序有问题,根本没法测试线程安全性,我留在这里,以此作为反面教材,大家不要看了。下面的程序是取出后在进行赋值,集合的隔离级别防不住这个,所以是下面的程序有问题,不过我也没想到好办法来测试这个线程不安全。
没有使用Collections.synchronizedSortedSet()进行包装的HashSet的程序
import java.util.*;
public class CollectionTest2
{
public static void main(String[] args)
{
//这里试一下,不使用Collections.synchronizedSortedSet()包装,
//然后让两条线程分别取出LinkedHashSet中的第一个数字进行+1然后再放进去
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();
}
}
//使用第一种方法创建线程
//继承Thread类创建线程类
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++)//加5
{
int n = (int) set.toArray()[0];
set.clear();
set.add(n+1);
System.out.println(set);
}
}
}
执行结果如下
从上面的结果可以看出,一个程序会出现两个结果,这就是线程不安全,
大错特错
把上面程序的HashSet用Collections.synchronizedSortedSet()抱起来后,执行结果如下: