Volatile与各种JUC同步锁

Volatile保证线程可见性

--MESI

--缓存一致性协议  线程可见性在CPU级别是通过缓存一致性协议保证的

Volatile禁止指令重排序(CPU)

指令重排序在CPU级别是无法禁止的,因为是在CPU内部运行的原理。而在jvm中加上volatile关键字是可以实现禁止指令重排序的,volatile给CPU发出指令,CPU中有原语指令

loadfence(读屏障)和storefence(写屏障)的操作

 - DCL单例

 -Double Check Lock

 -Mgr06.java

Volatile不能保证原子性

CAS(无锁优化 自旋)

1.Compare And Set/Swap

2. cas(V,Expected,NewValue)V,原始值;Expected,期望当前的值是什么;NewValue,要设定的新值

 --if V ==E

   V=New

  Otherwise try again or fail

 --CPU原语支持

3.ABA问题的解决 加version 比较上一个值的version。cas(version)

AtomicInteger,AtomicLong,LongAdder。AtomicXXX->CAS

Increment->sync atomicXXX  

各种JUC同步锁

ReentrantLock vs synchronized 区别

  1. ReentrantLock需要程序手动加锁和手动解锁,sync系统自动加锁和自动解锁
  2. R有各种condition(等待队列),sync没有
  3. 底层实现:

ReentrantLock是CAS的实现,sync默认进行四种锁状态的升级

ReentrantLock 可以替代 synchronized,底层是cas vs sync,trylock,lockinterupptibly,可以在公平锁和非公平锁两者之间切换

ReentrantLock 默认false,非公平锁

公平锁概念:线程来获取资源时看queue里有没有线程在排队,如果有就要排队等着。

非公平锁:线程来获取资源时不管queue里有没有线程在排队,上来就抢锁

CountDownlatch 倒数门闩锁

CyclicBarrier 循环栅栏锁

Phaser 阶段锁

ReadWriteLock-StampedLock 读写锁的概念就是共享锁和排它锁,读锁:共享锁,写锁:排它锁

Semaphore 信号灯,使用于限流。场景,卖票,车道,收费站

公平锁与非公平锁,它默认是非公平的

Semaphore的主要方法摘要:

void acquire():从此信号量获取一个许可,在提供一个许可前一直将线程阻塞,否则线程被中断。

void release():释放一个许可,将其返回给信号量。

int availablePermits():返回此信号量中当前可用的许可数。

boolean hasQueuedThreads():查询是否有线程正在等待获取。

原文链接:https://blog.youkuaiyun.com/u013851082/article/details/70208246

Exchanger交换器, 用于线程间交换数据。Exchanger.exchange() 方法是阻塞的

LockSupport.park 停车,LockSupport.unpark开车

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值