我一直在阅读名为 art of multiprocessor programming 的书,并遇到了 get()、getandset()、compareandset()、getandIncrease()、getandIncrease() 等函数。
书中说上述所有函数都是原子函数,我同意,但我对某些函数如何成为原子函数有自己的疑问。
为什么带有 get 或 compare 的函数变成原子的? - 因为它必须等到它获得值或等到某些条件变为真,这会产生障碍,因此是原子的。
我这样想对吗?有什么我错过的吗?
当我做的时候
if (tail_index.get() == (head_index.getAndIncrement())
这是原子的吗?
最佳答案
通过添加显式线程安全,方法相对于某个实例成为原子
。在许多情况下,这是通过将方法标记为 synchronized
来完成的。没有魔法,如果您查看声称方法是原子的线程安全类的源代码,您会看到锁定。
WRT 你的第二部分,不,它不是原子的。每个方法调用都是原子的,但是当你把两个放在一起时,组合就不是原子的了。 get
和 getAndIncrement
已被显式设为原子。一旦你添加了其他代码(或调用的组合),除非你这样做,否则它不是原子的。
关于java - 一个函数如何变成原子的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20198883/