NutzCN Logo
问答 Java多线程同步的问题
发布于 2572天前 作者 qq_c54e87f6 1845 次浏览 复制 上一个帖子 下一个帖子
标签:

打扰了,问一下,就是看到书上说1.8之前HashMap在多线程下使用会产生死循环的问题。
分析原因后,有一点很疑惑,希望能够得到解答,感激不尽 如下
假设两个线程同时对map进行put操作,也就是两个线程同时持有共享变量map的副本,
那么当两个线程同时操作共享变量map的时候,如果线程没有将副本中的数据刷入到内存
实际上线程1是无法感知到线程2对map执行了put操作。但是看到书上的解释,当线程2向
map中put了数据后,线程1却感知到了线程2 put的数据,对此感到很疑惑。

请问,两个线程在访问共享变量的时候,在没有使用锁以及volatile的情况下,只要线程没有
结束就不会将本线程的副本刷入到主存,当线程开始之后,只会在本地副本中获取数据,这个理解是否正确?

如果正确的话,是否就说明书上的解释是错的。。。
1 回复

额,你学C中毒了。。。

java一般不会关心刷内存的问题。。。

我觉得你不应该盯着hashmap看。

多线程操作java对象是否会导致问题,取决于这个对象对象是否有状态的,或者说,这个对象有实例属性。 如果一个对象没有实例变量,例如Object.class,就不存在线程安全问题。

至于为何有实例变量就会出事,我觉得我可以举个例子

A类有一个x实例属性,初始值是0,j线程设置x为1,k线程将x设置为-1,同时启动jk两个线程后,在jk两个线程都结束之前,x变量的值可能是-1,0,1,这时候,我们再通过第三个线程获取x的值,如果x小于0就毁灭地球,是不是就很好玩了。。。 换成单线程,那么jk的执行必然有序,第三个线程也只能在jk后执行,得到的结果就与jk的顺序相关,绝不会错。

至于hashmap为啥死循环,那是hashmap内部实现的问题,虽然hashmap里面没写x<0就死循环,但也是多线程下的出事的例子而已啦。

添加回复
请先登陆
回到顶部