首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

作甚原子访问(atomic access)

2012-12-14 
何为原子访问(atomic access)原子访问是线程安全的stest以上语句算原子访问吗?何为对引用变量的读写?

何为原子访问(atomic access)
原子访问是线程安全的

s="test";

以上语句算原子访问吗?
何为对引用变量的读写?请举例说明!谢谢!
[最优解释]
原子在英文里的原意大概有 “小到不可再分割” 的意思

这里取的就是“不可分割”

比如有一些操作,要么都完成,要么什么都不做, —— 不可分割。

int a = 10;

最终执行的时候,就是往 4 个 byte 一共 32 个 bit 里面写 0 和 1,“原子”就是说要么 32 个 bit 都写完,要么还没开始写,不会出现任何中间的情况,就是“不可分割”。
[其他解释]



int a;       // 一个“基本类型变量”
String b, c; // 两个“引用变量”,有别于“基本类型变量”,它的值本身只是一个地址,用于指向对象

b = "str";   // 对 “引用变量” b 的写操作,是“原子访问”
c = b;       // 对 “引用变量” b 的读操作


“原子访问是线程安全的”

这句话有点问题,原子性是线程安全的必要条件,不是充分条件。 

“原子性” != “线程安全”

具体什么才是“线程安全”,不同的情况有不同的需求,建议你自己看书,有一本 Doug Lea 的 《Java Concurrency in Practice》很好。
[其他解释]
谢谢!
看来偶的理解没错
但是偶的小程序有时出错,(大部分时间运行正确)
偶怀疑是线程安全,现在看来又不像
感觉最难找的bug就是这种少数时间发生的错
[其他解释]
引用:
谢谢!
看来偶的理解没错
但是偶的小程序有时出错,(大部分时间运行正确)
偶怀疑是线程安全,现在看来又不像
感觉最难找的bug就是这种少数时间发生的错


恩,我也觉得,能够重现的错误debug就容易很多

多线程的debug是很困难的,尤其是那种不是每次都发生的错误
[其他解释]
c = b;       // 对 “引用变量” b 的读操作

以上语句算原子访问吗?
[其他解释]
引用:
c = b;       // 对 “引用变量” b 的读操作

以上语句算原子访问吗?


是的
[其他解释]
c = b;       // 对 “引用变量” b 的读操作

这条语句既包括对b的读,又包括对c的写
[其他解释]
Oracle网站上是这样讲的:

However, there are actions you can specify that are atomic:
Reads and writes are atomic for reference variables and for most primitive variables (all types except long and double).

没讲清楚还是偶的理解能力太差?
[其他解释]
引用:
c = b;       // 对 “引用变量” b 的读操作

这条语句既包括对b的读,又包括对c的写


如果你把它拆开:

线程一从 b 读取值
线程一向 c 写入值


然后下面这两种有没有区别:

第一种:
线程一从 b 读取值
线程二向 b 写入新的值
线程一向 c 写入值


第二种:
线程一从 b 读取值
线程一向 c 写入值
线程二向 b 写入新的值


有没有区别?
“线程二向 b 写入新的值”,到底有没有破坏 c = b; 的原子性?
取决于你对这里的原子性如何定义

在我看来 “线程二向 b 写入新的值” 更像是 b 的 “可见性” 没有保证,因为 —— c 没有得到 b 的最新值。
对变量 b 加 volatile 修饰来保障其可见性,就解决了这个问题。




[其他解释]

引用:
Oracle网站上是这样讲的:

However, there are actions you can specify that are atomic:
Reads and writes are atomic for reference variables and for most primitive variables (all types except long……


这里讲的 “读和写” 都是指的单个操作,单个的读操作,和单个的写操作。
[其他解释]
引用:
引用:c = b;       // 对 “引用变量” b 的读操作

这条语句既包括对b的读,又包括对c的写

如果你把它拆开:

线程一从 b 读取值
线程一向 c 写入值


然后下面这两种有没有区别:

第一种:
线程一从 b 读取值
线程二向 b 写入新的值
线程一向 c 写入值


第二种:
……


然后,我觉得“从 b 读取值” 和 “向 c 写入值” 更像是一个操作,“读取值”可以想象为瞬间完成的,这个操作可以描述为“向c写入b的值”,问题仅在于这里得到的“b的值”是不是最新的。
[其他解释]
谢谢指教!
您说的好像和Oracle网站上的教程差不多

有没有“单个的读操作”?
看来“c = b; ”并不是单个的读操作

热点排行