Java锁、CAS

一、 Java锁

1.常见的锁有synchronized和Lock()
①synchronized 是jvm层面实现的,可以直接用,不过要锁住某个对象;lock是属于j.u.c包下的接口,用的时候要实现lock接口。
②synchronized一般和wait()、notify()、notifyAll()一起使用,使用完不用释放锁;lock必须在finally里面手动释放。
@lock锁与synchronized相比,lock锁添加一些其他特性,如中断锁等候和定时锁等候。
④资源竞争激励的情况下,lock性能会比synchronize好,竞争不激励的情况下,synchronize比lock性能好。

2.悲观锁与乐观锁
①悲观锁认为世界是悲观的,当去拿数据的时候就上锁,这样别人想拿这个锁就会阻塞直到拿到锁,传统的数据库用到了这种锁,像行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。再比如Java里面的同步原语synchronized关键字的实现也是悲观锁。
②乐观锁,认为一般并发是不会发生的,所以不会上锁。基于CAS(无锁编程)实现,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制(解决ABA问题)。乐观锁适用于多读的应用类型,这样可以提高吞吐量。

3.CAS是什么?
答:CAS是一种无锁思想
当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。

CAS里有三个操作数,原值V、预期原只A、修改数B,当V==A时才进行修改,否者竞争失败。

4.ABA问题
①如何产生的?
Thread1开始cas(1,1,2)操作,读到了val=1;的值,线程挂起
Thread2将A的值改为2又改回来,相当于值没变,但是却被修改过。
这是Thread1得到cpu,继续执行,这时判断V是否等于A,虽然相等,但事情的本质已经发生了改变。
②如何解决
加标志:在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值