我正在学习多线程编程从'Java并发在实践‘。
书中一度说,即使是看起来无害的增量操作也不是线程安全的操作,因为它由三个不同的operations...read、modify组成。
class A {
private void int c;
public void increment() {
++c;
}
}因此,增量语句不是原子的,因此也不是线程安全的。
我的问题是,如果一个环境真的是并发的(即多个线程能够完全同时执行它们的程序语句),那么一个真正是原子的语句也不可能是线程安全的,因为多个线程可以读取相同的值。那么,如何使用原子语句来帮助实现并发环境中的线程安全呢?
发布于 2015-07-25 05:11:21
在修改状态时,不存在真正的并发性。
This post对并发性和并行性有一些很好的描述。
如@RitchieHindle在那篇文章中所述:
并发是指两个任务可以在重叠的时间段内启动、运行和完成。这并不一定意味着他们将永远在同一时刻运行。例如:在一台单核机器上多任务处理。
例如,非原子操作的危险在于,一个线程可能读取该值,另一个线程可能修改该值,然后原始线程可能修改和写入该值(从而否定了第二个线程所做的修改)。
原子操作不允许其他操作在原子操作中间访问状态。例如,如果增量操作符是原子的,则在进行这些操作时,它将在没有任何其他线程访问该变量的情况下读取、修改和写入这些变量。
发布于 2015-07-25 05:13:34
您可以使用AtomicInteger。链接的Javadoc表示(部分)它是一个可以原子更新的int值。AtomicInteger还实现了addAndGet(int),它原子地将给定的值添加到当前值中。
private AtomicInteger ai = new AtomicInteger(1); // <-- or another initial value
public int increment() {
return ai.addAndGet(1); // <-- or another increment value
}这可以(例如)保证多个线程的写入顺序一致性。考虑一下,ai可能表示(或包括)某些static (或全局)资源。如果一个值是线程本地的,那么您不需要考虑原子性。
https://stackoverflow.com/questions/31623142
复制相似问题