怎么使用 ConcurrentHashMap 才能是线程安全的?

本文探讨了在并发环境中使用ConcurrentHashMap进行线程安全数据存储的问题,并提供了解决方法。通过实例展示了如何避免线程间的数据冲突,以及在并发访问场景下的性能表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值