zoukankan      html  css  js  c++  java
  • Java多线程并发编程之原子变量与非阻塞同步机制

    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.性能比较:锁与原子变量

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









  • 相关阅读:
    微信nickname乱码(emoji)及mysql编码格式设置(utf8mb4)解决的过程
    eclipse Specified VM install not found: type Standard VM, name
    eclipse中安装Open Explorer
    关于Java变量的可见性问题
    Win8&Win2012R2如何支持DOTA2输入法
    Adobe Flash player 10 提示:Error#2044:未处理的IOErrorEvent. text=Error#2036:加载未完成 的解决方法
    IntelliJ IDEA 12.1.4 解决中文乱码
    Win8.1RTM英文版安装中文语言包的两种方法
    在FlashDevelop里使用1.8版本的的TortoiseSVN
    [修复Win8.1 BUG] 解决Win8.1英文字体发虚不渲染问题
  • 原文地址:https://www.cnblogs.com/csu_xajy/p/4306995.html
Copyright © 2011-2022 走看看