服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服务器之家 - 编程语言 - JAVA教程 - Java并发编程之原子变量与非阻塞同步机制

Java并发编程之原子变量与非阻塞同步机制

2019-12-16 13:21junjie JAVA教程

这篇文章主要介绍了Java并发编程之原子变量与非阻塞同步机制,本文讲解了非阻塞算法、悲观技术、乐观技术、CAS操作、原子变量、性能比较:锁与原子变量等内容,需要的朋友可以参考下

1.非阻塞算法

非阻塞算法属于并发算法,它们可以安全地派生它们的线程,不通过锁定派生,而是通过低级的原子性的硬件原生形式 —— 例如比较和交换。非阻塞算法的设计与实现极为困难,但是它们能够提供更好的吞吐率,对生存问题(例如死锁和优先级反转)也能提供更好的防御。使用底层的原子化机器指令取代锁,比如比较并交换(CAS,compare-and-swap).

2.悲观技术

独占锁是一种悲观的技术.它假设最坏的情况发生(如果不加锁,其它线程会破坏对象状态),即使没有发生最坏的情况,仍然用锁保护对象状态.

3.乐观技术

依赖冲突监测.先更新,如果监测发生冲突发生,则放弃更新后重试,否则更新成功.现在处理器都有原子化的读-改-写指令,比如比较并交换(CAS,compare-and-swap).

4.CAS操作

CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。CAS典型使用模式是:首先从V中读取A,并根据A计算新值B,然后再通过CAS以原子方式将V中的值由A变成B(只要在这期间没有任何线程将V的值修改为其他值)。

清单 3. 说明比较并交换的行为(而不是性能)的代码

复制代码代码如下:


public class SimulatedCAS {
     private int value;

 

     public synchronized int getValue() { return value; }

    public synchronized int compareAndSwap(int expectedValue, int newValue) {
         int oldValue = value;
         if (value == expectedValue)
             value = newValue;
         return oldValue;
     }
}


清单 4. 使用比较并交换实现计数器

复制代码代码如下:

public class CasCounter {
    private SimulatedCAS value;
    public int getValue() {
        return value.getValue();
    }
    public int increment() {
        int oldValue = value.getValue();
        while (value.compareAndSwap(oldValue, oldValue + 1) != oldValue)
            oldValue = value.getValue();
        return oldValue + 1;
    }
}


5.原子变量

 

原子变量支持不用锁保护就能原子性更新操作,其底层用CAS实现。共有12个原子变量,可分为4组:标量类、更新器类、数组类以及复合变量类。最常用的原子变量就是标量类:AtomicInteger、AtomicLong、AtomicBoolean以及AtomicReference。所有类型都支持CAS。

6.性能比较:锁与原子变量

在中低程度的竞争下,原子变量能提供很高的可伸缩性,原子变量性能超过锁;而在高强度的竞争下,锁能够更有效地避免竞争,锁的性能将超过原子变量的性能。但在更真实的实际情况中,原子变量的性能将超过锁的性能。

延伸 · 阅读

精彩推荐
  • JAVA教程Java用文件流下载网络文件示例代码

    Java用文件流下载网络文件示例代码

    这篇文章主要介绍了Java用文件流的方式下载网络文件,大家参考使用吧 ...

    java技术网4782019-10-22
  • JAVA教程Java用for循环Map详细解析

    Java用for循环Map详细解析

    本篇文章主要介绍了Java用for循环Map,需要的朋友可以过来参考下,希望对大家有所帮助 ...

    java开发网4812019-10-24
  • JAVA教程java线程并发semaphore类示例

    java线程并发semaphore类示例

    Java 5.0里新加了4个协调线程间进程的同步装置,它们分别是Semaphore, CountDownLatch, CyclicBarrier和Exchanger,本例主要介绍Semaphore,Semaphore是用来管理一个资源池的工...

    java教程网4632019-10-31
  • JAVA教程Java进阶教程之IO基础

    Java进阶教程之IO基础

    这篇文章主要介绍了Java进阶教程之IO基础,这里只是对Java IO的基本介绍,包含读取和写入等操作,需要的朋友可以参考下 ...

    Vamei4892019-11-27
  • JAVA教程java日期工具类实例分享

    java日期工具类实例分享

    本文介绍一个java日期工具类,功能有英文简写、英文全称、精确到毫秒的完整时间、中文简写、中文全称等方法 ...

    java技术网1942019-10-29
  • JAVA教程Java设计模式之迭代模式(Iterator模式)介绍

    Java设计模式之迭代模式(Iterator模式)介绍

    这篇文章主要介绍了Java设计模式之迭代模式(Iterator模式)介绍,本文用一个老师点名的现象描述了迭代模式的使用,需要的朋友可以参考下 ...

    junjie4762019-12-11
  • JAVA教程java jdk动态代理详解

    java jdk动态代理详解

    动态代理类的Class实例是怎么生成的呢,是通过ProxyGenerator类来生成动态代理类的class字节流,把它载入方法区 ...

    java技术网1412019-10-14
  • JAVA教程MapReduce中ArrayWritable 使用指南

    MapReduce中ArrayWritable 使用指南

    MapReduce是一种编程模型,用于大规模数据集的并行运算。概念"Map(映射)"和"Reduce(归约)"和他们的主要思想,都是从函数式编程语言里借来的,还有从矢量编...

    hebedich1632019-11-27