java - 一个函数如何变成原子的?

标签 java concurrency parallel-processing atomic lock-free

我一直在阅读名为 art of multiprocessor programming 的书,并遇到了 get()、getandset()、compareandset()、getandIncrease()、getandIncrease() 等函数。

书中说上述所有函数都是原子函数,我同意,但我对某些函数如何成为原子函数有自己的疑问。

为什么带有 getcompare 的函数变成原子的? - 因为它必须等到它获得值或等到某些条件变为真,这会产生障碍,因此是原子的。

我这样想对吗?有什么我错过的吗?

当我做的时候

 if (tail_index.get() == (head_index.getAndIncrement()) 

这是原子的吗?

最佳答案

通过添加显式线程安全,方法相对于某个实例成为原子。在许多情况下,这是通过将方法标记为 synchronized 来完成的。没有魔法,如果您查看声称方法是原子的线程安全类的源代码,您会看到锁定。

WRT 你的第二部分,不,它不是原子的。每个方法调用都是原子的,但是当你把两个放在一起时,组合就不是原子的了。 getgetAndIncrement 已被显式设为原子。一旦你添加了其他代码(或调用的组合),除非你这样做,否则它不是原子的。

关于java - 一个函数如何变成原子的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20198883/

相关文章:

java - 用于为我的应用程序选择启动语言的菜单(Android SDK)

C# 字典,键是字符串,值是计数器。近似算法和线程安全

java - 关键部分: be sure that this method is executed by only 1 thread

algorithm - 寻找用于并行化的计算密集型 GIS 操作,其中 Arc GIS 需要很长时间才能执行

c++ - Karatsuba - 使用 CUDA 进行多项式乘法

multithreading - 在单核系统中如何处理抢占?

java - @ConfigurationProperties 前缀不起作用

java - 如何在linux中编译几个java类和文本文件

java - 使用 Java 代码中的不同引号执行 Bash 单行代码以进行 Elasticsearch 查询

java - 在线程 1 中调用构造函数,在线程 2 中独占访问字段 - 需要 volatile 吗?