Java-乐观锁和悲观锁 ReentrantLock和Syn

2020-01-06  本文已影响0人  小小的coder

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

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

悲观锁是挺好的,也很安全,但有缺点:
1.可能会导致优先级高的线程等待优先级低的线程导致优先级倒序;
2.加锁,放锁次数过多,引起性能问题

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

CAS:
当多个线程使用CAS获取锁,只能有一个成功,其他线程返回失败,继续尝试获取锁;
CAS操作中包含三个参数:V(需读写的内存位置)+A(准备用来比较的参数)+B(准备写入的新值):若A的参数与V的对应的值相匹配,就写入值B;若不匹配,就写入这个不匹配的值而非B;

20180827200220265.png

ReentrantLock和Synchronize区别:
锁的实现:
Synchronized是依赖于JVM实现的,而ReenTrantLock是JDK实现的,有什么区别,说白了就类似于操作系统来控制实现和用户自己敲代码实现的区别。前者的实现是比较难见到的,后者有直接的源码可供阅读。

便利性:
很明显Synchronized的使用比较方便简洁,并且由编译器去保证锁的加锁和释放,而ReenTrantLock需要手工声明来加锁和释放锁,为了避免忘记手工释放锁造成死锁,所以最好在finally中声明释放锁。

ReenTrantLock可以指定是公平锁还是非公平锁。而synchronized只能是非公平锁。所谓的公平锁就是先等待的线程先获得锁
————————————————
原文链接:https://blog.csdn.net/emmmsuperdan/article/details/82118405

上一篇 下一篇

猜你喜欢

热点阅读