【发布时间】:2016-06-09 03:40:11
【问题描述】:
因为原子意味着线程安全。当 .set() 本身在 java 中是原子和线程安全的时候,我们什么时候使用 compareAndSet?
例如,我想以原子方式设置一个变量,以便每个其他线程都可以看到它(但我希望以线程安全的方式设置该变量)我可以简单地将其声明为 volatile AtomicBoolean 或 volatile AtomicInteger 并且应该好吗?在哪些情况下我需要使用 compareAndSet?
【问题讨论】:
-
例如,如果您想将值设置为
100当且仅当当前值是300,您会怎么做。您无法读取该值并自己进行比较,因为在您比较期间,其他线程可能已经更新了该值。 -
线程安全不是可组合。即,完全用线程安全的类构建东西将不保证您构建的东西是线程安全的。如果您的程序天真地执行原子比较操作,然后执行原子集合操作,则该 sequence 操作不是原子的。
标签: java multithreading concurrency compare-and-swap