Java Lock 以及乐观锁和悲观锁

线程获取锁的过程:

 成功获取锁的线程,它会从等待队列中出列,并得到共享资源;

没有获取到锁的线程,继续在等待队列中,阻塞在lock方法;

线程释放锁的过程:

通过 在finally语句中的unlock方法,将锁释放,然后等待队列中的线程去竞争这个锁;

悲观锁:每次访问数据线程都是处于阻塞的状态,这样提高安全性,像读锁,写锁都是用到了悲观锁,以及synchronize关键字(独占锁);

乐观锁:每次访问数据线程都是运行状态,这样可以提高数据吞吐量

悲观锁是挺好的,也很安全,但有缺点:1.可能会导致优先级高的线程等待优先级低的线程导致优先级倒序;

                                                                  2.加锁,放锁次数过多,引起性能问题

乐观锁:就假定不会发生并发冲突,最后通过比较数据来查看是否真的发生了冲突,并交由用户来决定。最典型的实现方式是CAS(compare and swap):

CAS

当多个线程使用CAS获取锁,只能有一个成功,其他线程返回失败,继续尝试获取锁;

CAS操作中包含三个参数:V(需读写的内存位置)+A(准备用来比较的参数)+B(准备写入的新值)若A的参数与V的对应的值相匹配,就写入值B;若不匹配,就写入这个不匹配的值而非B;

猜你喜欢

转载自blog.csdn.net/emmmsuperdan/article/details/82118405
今日推荐