前言
CAS乐观锁、悲观锁讲解
01 CAS乐观锁是什么?02 悲观锁是什么?
前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!
CAS乐观锁、悲观锁讲解 01 CAS乐观锁是什么?
简单翻译就是比较然后交换
如下:当返回0 的时候表示该资源可以访问,1的时候表示资源已经被占用。
int cas(long addr,long oldValue,long newValue){
if(addr !=oldValue){
return 0;
}
addr=newValue;
return 1;
}
从上面看,还是不完善的,因为它没有锁定资源,如果使用互斥锁的话,又没有了意义,因此给予各种不同的架构都提供了指令级别的CAS原子操作,
才形成互斥锁的实现效果,因此它是【无锁的同步机制】。
注:当前如果有多个线程访问资源对象时,如果一个线程CAS返回1,在实际应用中,我们不会让B线程就这么放松,通常使其进行自旋(不断的重试CAS操作),通常我们会配置自旋次数来防止死循环。
例:我们如何用三条线程将0累加到1000?
public class CasTest {
//它的底层是给予CAS操作的计数器
static AtomicInteger num = new AtomicInteger(0);
public static void main(String[] args) {
for (int i=0;i<3;i++){
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while (num.get()<1000){
System.out.println("thread name:"+Thread.currentThread().getName()+":"+num.incrementAndGet());
}
}
});
thread.start();
}
}
}
AtomicInteger:它的底层是给予CAS操作的计数器。
02 悲观锁是什么?多个线程操作一个资源对象,是悲观的,简单来说就是操作系统将会悲观的认为如果不严格同步线程调用那么一定会产生异常,所以互斥锁将会锁定资源,只供一个线程调用,而阻塞其他线程。
注:大部分调用其实都是读操作,而对于该行为就没必要使用悲观锁,因为会浪费大量的资源。



