美文网首页
java无锁

java无锁

作者: 778bc750a218 | 来源:发表于2019-09-26 14:08 被阅读0次

    原子性 :

        即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行

    可见性:

        可见性是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。

    有序性:

       即程序执行的顺序按照代码的先后顺序执行。

    volatile:

        volatile可以保证线程可见性且提供了一定的有序性,但是无法保证原子性。在JVM底层volatile是采用“内存屏障”来实现的。

        1.保证可见性

        2.不保证原子性

        3.禁止指令重排序


    1.AtomicInteger    

    final int get()        //去的当前值

    final void set( int newValue )        //设置当前值

    final int getAndSet( int newValue )        //设置新值,并返回旧值

    final boolean compareAndSet( int expect, int u )                   //如果当前值为expect,则设置为u

    final int getAndIncrement()                   //当前值加1,返回旧值

    final int getAndDecrement()                   //当前值减1,返回旧值

    final int getAndAdd( int delta )                //当前值增加delta,返回旧值

    final int IncremenAndGet()                //当前值加1,返回新值

    final int decremenAndGet()                //当前值减1,返回新值

    final int addAndGet( int delta)                //当前值增加delta,返回新值

    2.Unsafe(不推荐使用,不同jdk实现方法不一样)

    3.AtomicReference

        对引用进行修改

        是一个模板类,抽象化数据类型

        主要有get、set 、compareAndSet、getAndSet方法还有layzeSet、weakCompareAndSet

    4.AtomicStampedReference

        带有邮戳(注:时间戳等,能够标识唯一性的,且有序的数据)的的引用修改类。

        应用场景如:多线程写操作时对于数据敏感情况下,监听某一数值条件并进行有限次写操作的情况下,需要对数据当前引用对象进行时间判断是否,这里注意不能用compareAndSet虽然值可能相同,但是我们进行的是有限次写操作,读操作获得值的时间可能在AtomicReference.compareAndSet时取得是值是相同,但对象可能已经被其他线程修改但与当前值相等。所以需要AtomicStampedReference;

    5.AtomicIntegerArray、ReferenceArray、LongArray

    6.AtomicIntegerFieldUpdater

        让普通变量也享受原子操作

        方法:

        <U>    AtomicIntegerFieldUpdater.newUpdater( Class<U> tclass , String fieldName);

        注:普通变量需要加上volatile

        


    相关文章

      网友评论

          本文标题:java无锁

          本文链接:https://www.haomeiwen.com/subject/aofwuctx.html