Java中怎么实现原子操作类

这篇文章将为大家详细讲解有关Java中怎么实现原子操作类,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

创新互联是专业的二道江网站建设公司,二道江接单;提供网站设计、成都做网站,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行二道江网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

 

一、引言

在 JDK1.5 中新增 java.util.concurrent(J.U.C) 包,它建立在 CAS 之上。CAS 是非阻塞算法的一种常见实现,相对于 synchronized 这种阻塞算法,它的性能更好。

DK1.5 中引入了底层的支持,在 int、long 和对象的引用等类型上都公开了 CAS 的操作,并且 JVM 把它们编译为底层硬件提供的最有效的方法,在运行 CAS 的平台上,运行时把它们编译为相应的机器指令。在 java.util.concurrent.atomic 包下面的所有的原子变量类型中,比如 AtomicInteger,都使用了这些底层的JVM支持为数字类型的引用类型提供一种高效的 CAS 操作。


二、Java原子类介绍

atomic 包中的 13 个类,属于 4 种类型的原子更新方式.

  • (1)原子更新基本类型

  • (2)原子更新数组

  • (3)原子更新引用

  • (4)原子更新属性

atomic 包里的类基本都是使用 Unsafe 实现的包装类.

 

1.原子更新基本类型

  • AtomicBoolean:原子更新布尔类型。

  • AtomicInteger:原子更新整型。

  • AtomicLong:原子更新长整型。

本类以 AtomicInteger 进行讲解:

AtomicInteger 是一个支持原子操作的 Integer 类,就是保证对 AtomicInteger 类型变量的增加和减少操作是原子性的,不会出现多个线程下的数据不一致问题。如果不使用 AtomicInteger,要实现一个按顺序获取的 ID,就必须在每次获取时进行加锁操作,以避免出现并发时获取到同样的 ID 的现象。

  • int addAndGet(int delta) 以原子方式将输入的数值与实例中的值相加,并返回结果;

  • boolean compareAndSet(int expect, int update) 如果输入的数值等于预期值,则以原子的方式将该值设置为输入的值;

  • int getAndIncrement() 以原子方式将当前值加 1,注意,这里返回的是自增前的值;

  • void lazySet(int newValue) 最终会设置成 newValue,使用 lazySet 设置值后,可能导致其他线程在之后的一小段时间内还是可以读到 旧值;

  • int getAndSet(int newValue) 以原子方式设置为 newValue 的值,并返回旧值。

那么getAndIncrement 是如何实现原子操作的呢?

1public final int getAndIncrement() { 
2    for (;;) { 
3        int current = get(); 
4        int next = current + 1; 
5        if (compareAndSet(current, next)) 
6            return current; 
7    } 
8}

关于Java中怎么实现原子操作类就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。


当前题目:Java中怎么实现原子操作类
浏览路径:http://ybzwz.com/article/popise.html