在并发编程中,需要确保当多个线程同时访问时,程序能够获得正确的结果,即实现线程安全。线程安全性定义如下:
当多个线程访问一个类时,无论如何调度运行时环境或如何交替执行这些线程,并且主代码中不需要额外的同步或协作,该类都可以正确地运行,因此该类是线程安全的。
线程安全需要两件事:
- 保证线程的内存可见性
- 保证原子性
以线程不安全性为例。如果我们想要实现一个函数来对页面访问进行计数,那么您可能想要count+,但是这个增量操作不是线程安全的。Count++可以分为三个操作:
假设计数的初始值为10,当执行并发操作时,线程A和B可以同时进行1次操作,然后进行2次操作。A前进到3+1,当前值为11。注意,AB刚才获得的当前值是10,所以在B执行3次操作之后,计数仍然是11。这个结果显然不符合我们的要求。
因此,我们需要使用本文的主角Atomic Integer来确保线程安全。
Atomic Integer的源代码如下:
AtomicInteger Number serialVersionUID = 6214790243416807050L
Unsafe unsafe =
valueOffset = (AtomicInteger..getDeclaredField("value" } (Exception ex) {
AtomicInteger( value =
set( value =
lazySet( unsafe.putOrderedInt(
getAndSet( current =
compareAndSet( expect, unsafe.compareAndSwapInt(
weakCompareAndSet( expect, unsafe.compareAndSwapInt(
current = next = current + 1
current = next = current - 1
getAndAdd( current = next = current +
current =