原子操作CAS和显示锁

什么是原子操作?如何实现原子操作

Atom(不可分割)

syn基于阻塞的锁的机制,1.被阻塞的县城优先级很高。2. 拿到锁的线程一直不释放锁。3.大量的竞争,消耗CPU,同时带来死锁或者其他安全问题。

CAS原理

CAS(Compare And Swap),指令级别保证是一个原子操作。
三个运算符:一个内存地址v,一个期望的值A,一个新值B。
基本思路:如果地址v上的值和期望的值A相等,就给地址v赋给新值B,如果不是,不做任何操作。
循环(死循环,自旋)里不断的进行CAS操作。

利用了现代处理器都支持的CAS的指令,循环这个指令,直到成功为止。

CAS的问题

ABA问题:引入版本号
开销问题:CAS长期操作不成功,cpu不断地循环
只能保证一个共享变量的原子操作

JDK中相关原子操作类的使用

更新基本类型类
更新基本数组类
更新引用类型
AtomicMarkableReference,boolean 有没有动过
AtomicStampedReference,动过几次
原子更新字段类

显示锁

Lock接口和核心方法

使用显示锁的范式

private Lock lock = new ReentrantLock();
private int count;

public void increament(){
	lock.lock();
	try{
		count++;
	}finally{
		lock.unlock();
	}
}

Lock接口和synchronized的比较

synchronized代码简洁。Lock:业务需要获取锁可以被中断,超时获取锁,尝试获取锁.

可重入锁ReentrantLock、所谓锁的公平和非公平
如果在时间上,先对锁进行获取的请求,一定先被满足,这个锁就是公平的,不满足就是非公平
非公平锁的效率一般来讲更高,

ReadWriteLock接口和读写锁ReentrantReadWriteLock,什么情况下用读写锁?
ReentrantLock和synchronized关键字,都是排他锁(同一时刻只允许一个线程访问)。
读写锁:同一时刻允许多个读线程同时访问,但是写线程访问的时候,所有的读和写都被阻塞。 最适宜读多写少的情况

Condition

Lock和Condition实现等待通知
signal() 唤醒 await()等待

private Lock lock = new ReentrantLock();
private Condition cond1 = lock.newCondition();
private Condition cond2 = lock.newCondition();

一个lock可以对应多个condition

了解LockSupport工具

作用
阻塞了一个线程
唤醒了一个线程
构建同步组件的基础工具

park开头的方法
阻塞

unpark(Thread thread)方法
唤醒

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值