博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java并发编程——原子变量介绍
阅读量:2393 次
发布时间:2019-05-10

本文共 1729 字,大约阅读时间需要 5 分钟。

  • 第一部分:原子变量的前世

我们首先看一个例子:产生一个整数序列,每个值都必须是递增唯一的。我们可以用以下代码实现一个:

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方法,那么其他线程就等待当前线程执行完毕后再执行,这样就保证了整个操作的原子性。当这样做还是会给开发人员带来额外的负担,开发人员不得不去思考在哪些调用是需要共享的,同时还得避免死锁以及其他活跃性问题。于是,Java 5之后java.util.concurrent.atomic包下面的支持原子操作的类便诞生了。

  • 第二部分:原子变量的使用

java.util.concurrent.atomic包下面有很多支持以原子方式更新的类,比较常用的有:AtomicBoolean,AtomicInteger,AtomicLong和AtomicReference<V>。我们就以AtomicInteger类为例,讲讲它的用法:

还是上面的产生一个整数序列的例子,要求序列值唯一,用AtomicInteger就可以很容易实现。

AtomicInteger ai = new AtomicInteger();ai.incrementAndGet();

代码是不是很简洁,他同样线程安全的实现了一个唯一序列,使用起来更加方便和简单。AtomicInteger有两个构造方法,同时提供了很多其他支持原子操作的方法,

public class AtomicInteger{    public int addAndGet(int delta);//以原子方式将给定值与当前值相加,    public int getAndAdd(int delta);    public int decrementAndGet();//以原子方式将当前值减1,类似i--,--i    public int getAndDecrement();    public int getAndIncrement();//以原子方式将当前值加1,类似i++,++i    public int incrementAndGet();    public int get();//获取当前值    public void set(int value);//设置给定值    public void lazySet(int newValue);//最终设置某值        …………}

看了这些方法的方法名我想你就已经明白了如何使用他们。AtomicBoolean,AtomicLong和AtomicReference<V>的使用与AtomicInteger类似,可以通过查看API了解他们的具体方法。

原子类的出现简化了我们程序中的原子操作,使程序更加安全稳固。而且,在高并发的场景下,原子类的执行效率也要高于加锁的原子操作。因此,如果在项目中有类似的功能,不妨就试试java提供的原子工具类。

转载于:https://my.oschina.net/powerisam/blog/685259

你可能感兴趣的文章
JSP的入门简介
查看>>
JSP中的基本语法和3指令,6动作,9内置对象
查看>>
JSP的6个动作
查看>>
Java通过JDBC连接Mysql数据库的方法和实例
查看>>
Mysql事务
查看>>
DBUtils介绍
查看>>
Dbutils快速入门
查看>>
JAVA基础入门
查看>>
JAVA中的数据类型和方法重载
查看>>
JAVA中的数组
查看>>
java数组常见的排序——选择排序和冒泡排序
查看>>
JAVA中的static关键字
查看>>
JAVA中代码块
查看>>
JAVA中的继承和重写
查看>>
java中方法重写 this和super的区别
查看>>
java中匿名对象&final
查看>>
java中的抽象类abstract
查看>>
java中的接口
查看>>
java中接口的优点和缺点
查看>>
java中的多态
查看>>