java并发编程——原子变量介绍
第一部分:原子变量的前世 我们首先看一个例子:产生一个整数序列,每个值都必须是递增唯一的。我们可以用以下代码实现一个: public class UnsafeSequence{ private int value; public int getNext(){ return value++; } } 上面的代码在单线程环境下运行没有任何问题,但是如果在多线程并发访问的情况下它就会有问题。仔细分析getNext方法实际上它包含了三步操作: 第一步:获得当前value值; 第二步:把当前value值+1; 第三步:返回当前value值。 多个线程并发执行上面方法时,返回的value值极有可能是相同的,这显然违背了我们的初衷,所以这个类不是线程安全的。如下图所示: 我们可以用前面讲到的加锁知识把该类修改成线程安全的,最简单的就是给方法加synchronized; public class SafeSequence{ private int value; public synchronized int getNext(){ return value++; } } 修改完以后这个类现在是线程安全的了。如果有线程正在执行getNext方法,那么其他线程就等待当前线程执行完毕后再执行,这样就保证了整个操作的原子性。当这样做还是会给开发人员带来额外的负担,开发人员不得不去思考在哪些调用是需要共享的