magicblue 2011-07-18 10:35
浏览 308
已采纳

Java多线程变量可见性问题

网上搜了许久,所有关于可见性问题都是用的原生类型举例。
我的疑问是,如果变量是Java.Collection,一个线程调用了add方法。不加同步机制,其他的线程也看不到这个改动吗?
我觉得对于分配在堆上的对象,JVM不可能会为每一个线程都deep copy一份。所以,每个线程引用到的都是堆上的那个对象。
有些人说,CPU会在自己的缓存里缓存add方法调用的CPU指令,而不是立即刷出到主存里。如果是这样的话,对象的方法调用确实会存在不可见问题,但我在自己机器上测试,并没有出现不可见问题。按理说,多核心CPU的设计不应该这么弱智,这种情况只可能会出现在多CPU情况下。

疑惑中

  • 写回答

4条回答 默认 最新

  • iteye_14409 2011-07-19 04:36
    关注

    [quote]
    如果CPU缓存里放了在heap里的对象,那JSP里的:Memory that can be shared between threads is called shared memory or heap memory.这句话就有点问题了,内存数据不再是共享的状态。

    看一下这里:
    http://www.artima.com/insidejvm/ed2/jvm2.html
    有一句话:
    A thread's Java stack stores the state of Java (not native) method invocations for the thread. The state of a Java method invocation includes its local variables, the parameters with which it was invoked, its return value (if any), and intermediate calculations.
    似乎线程并不能copy在堆上的对象。我说效率低,是因为如果堆上的对象实际就是程序的领域对象了。这个对象集合可能非常大。比如一个graph数据结构,起内部的点边是相互关联的,线程遍历这个graph,修改每一个节点每一条边,如果依次copy对象到CPU缓存,效率是不可接受的。copy一个也许是OK的
    [/quote]

    JVM是由线程触发(启动)的,栈里面的内容是不会出现多线程安全的问题,栈里面的内容相当于ThreadLocal,OS线程利用CPU,关键是CPU会把内存中的数据Copy到Cache或寄存器中,如果是多核CPU中,多个线程分布在不同的核上,Cache或寄存器上就相互独立,最后提交到内存中,可能数据出现了不一致。

    一般的对象是Cache足够了,大对象是有小对象组成的(或称为数据),二级缓存现在都在2MB以上,已经足够,至少可以缓存部分数据,其他部分再想内存获取,一般情况CPU会利用Cache或寄存器,而不会直接走内存,除非特殊指令控制以外,你去看看自己主板的前端总线的传输效率,常识,CPU的缓存比内存快很多很多!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)
编辑
预览

报告相同问题?

悬赏问题

  • ¥20 机械振动学课后习题求解答
  • ¥15 IEC61850 客户端和服务端的通讯机制
  • ¥15 MAX98357a(关键词-播放音频)
  • ¥15 Linux误删文件,请求帮助
  • ¥15 IBMP550小型机使用串口登录操作系统
  • ¥15 关于#python#的问题:现已知七自由度机器人的DH参数,利用DH参数求解机器人的逆运动学解目前使用的PSO算法
  • ¥15 发那科机器人与设备通讯配置
  • ¥15 Linux环境下openssl报错
  • ¥15 我在使用VS编译并执行之后,但是exe程序会报“无法定位程序输入点_kmpc_end_masked于动态链接库exe上“,请问这个问题有什么解决办法吗
  • ¥15 el-select光标位置问题
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部