public class test {
public static ConcurrentHashMap chm = new ConcurrentHashMap();
public static void main(String[] args)
{
for(int i=1;i<100;i++)
{
th t = new th(i);
t.start();
}
}
}
class th extends Thread
{
private int number = 0;
public th(int _number)
{
number = _number;
}
@Override
public void run()
{
boolean bo = true;
while(bo){
int state = test.chm.get("test") == null ? 0 : (Integer)test.chm.get("test");
if(state == 9 )
{
System.out.println("线程:"+number+",停止!");
bo = false ;
}else
{
state = (int)(Math.random() * 100);
test.chm.put("test", state);
System.out.println("线程:"+number+",修改操作,状态="+state);
}
}
}
}
今天做了下测试,100个并发,通过ConcurrentHashMap 来存储数据来保证线程安全,
正确测试结果就是当一个线程随机数为9的时候,所有线程停止工作,但多执行几次还会发现,并发访问时,一个线程改变state为9,后其他线程还有继续在工作的.
线程:1,修改操作,状态=1
线程:2,修改操作,状态=9
线程:4,修改操作,状态=81
线程:6,停止!
线程:3,停止!
线程:8,停止!
线程:10,停止!
线程:7,停止!
检查了下 是多个线程执行到else里面时,state已经被之前的线程改为9了 ,造成的,说白了就是修改state=9这个线程在put之前,其他多个线程已经从map里读取stage的数据了,所以当state改成9,这些线程还可以执行else里面代码,并且将state又改成其他数了.
我可以通过同步代码块解决这问题,但就没有使用ConcurrentHashMap 的必须要了hashmap也可以做到.不知道是否我是ConcurrentHashMap 有问题?
ConcurrentHashMap 只是保证本身map的线程安全,不保证你自己写的程序的同步.
你可以采用客户端加锁实现同步
synchronized(test.chm)
转载地址:http://www.oschina.net/question/236000_71020