日期:2014-05-20  浏览次数:20638 次

关于java数组并发与缓存行的一些疑惑,求解惑
现在有一个数组,多个线程同时向给数组写入数据,每个线程知道自己应该写入的位置,不使用同步关键字,此时是不是并发的写入?如果考虑缓存行的为共享,加入左右padding,继续上述操作,此时是不是并发写? (缓存行和伪共享参看http://ifeve.com/falsesharing/ 和http://ifeve.com/disruptor-cacheline-padding/)




------解决方案--------------------
想要在Java平台实现通用的padding是很困难的,因为数组是对象,对象里就有其他内部的数据,在jvm版本一上避免了false sharing,在版本2中就未必有效了。

另外,至于是不是线程安全的,要看有没有读写操作,如果只有写操作,安全不安全又有什么关系,如果只有读操作,也不会出现不安全

如果上述数组有读写操作,且缺乏同步,数组元素的可见性是无法保证的。

至于更新数据到内存,JSR133规范第11节中有规定,即使没有同步,也不能出现word tearing(字分裂)情形。