JAVA多线程---无锁

Posted 丨核桃牛奶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA多线程---无锁相关的知识,希望对你有一定的参考价值。

无锁是一种乐观策略,使用CAS(compare and swap)来鉴别线程冲突,如果发生冲突,就重试当前操作直到没有冲突为止。

CAS(V,E,N) V要更新的变量,E表示预期值,N表示心值

仅当V=E时,才会将V设置为N  如果V!=E 说明已经有其他线程做了更新 当前线程什么也不做

CAS操作即使没有锁,也可以发现其他线程对当前线程的干扰,并进行恰当的处理。


AtomicInteger

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

compareAndSet ----> unsafe.compareAndSwapInt(Objuect obj,long valueOffset,int expect,int update)    

不支持static字段  

其实CAS也算是有锁操作,只不过是由CPU来触发,比synchronized性能好的多。  ---http://www.jianshu.com/p/9f0ba2bab24e

自己的应用程序无法使用Unsafe类 它是一个JDK内部使用的专属类


AtomicReference //保证修改对象引用时线程安全性

AtomicStampedReference //应用于“一次修改”  此时不仅比对值 也要比对时间戳


 

AtomicIntegerArray  AtomicLongArray AtomicReferenceArray  


AtomicIntegerFieldUpdater

利用反射机制

变量需要定义为 volatile 且不能是private static 类型  

 

以上是关于JAVA多线程---无锁的主要内容,如果未能解决你的问题,请参考以下文章

java多线程中的死锁活锁饥饿无锁都是什么鬼?

多线程关于无锁的线程是否安全问题

Java 多线程分析----CAS操作和阻塞

java 关于多线程高并发方面

javas的四种状态 无锁状态 偏向锁状态 轻量级锁状态 重量级锁状态

java核心-多线程- 并发原子类