java中的各种锁总结(简单全面版)

首先上一张图

 

是不是吓一跳,下面我们来一项一项说明各种锁的概念以及使用

1.乐观锁

乐观锁顾名思义就是一种乐观的思想,认为读数据时没有别的线程进行过修改,所以不会上锁,写数据时判断当前与期望的值是否相同,如果相同进行更新(更新期间是要枷锁的,为了保证原子性)

举例:java中的乐观锁---CAS

                CAS的使用以及CAS原子操作面临的问题,以及解决方案

                CAS的详细内容请参考

多线程常见面试题总结(简单版)_Mr.米斯特儿赵的博客-CSDN博客  第17个回答

2.悲观锁

   悲观锁顾名思义就是一种悲观的思想,每次拿数据都会悲观的认为其他线程修改了数据,所以每次读写时都会上锁,其他线程想要读写这个数据时,就会被该线程阻塞 ,直到这个线程释放锁.

举例: java中的悲观锁  synchronized修饰的方法和方法块  比如我们尝试用的hashtable,以及StringBuffer他们的方法都被synchronized修饰,ReentrantLock不仅悲观还重入(也属于重入锁)

3.自旋锁

自旋锁就是在获取锁的时候,如果锁被其他线程获取,该线程就会一直循环等待,一直尝试着去获取锁,直到目标达成。而不像普通的锁那样,如果获取不到锁就进入阻塞

自旋锁的优点: 避免了线程切换的开销,不会使线程进入阻塞的状态,减少了不必要的上下文的切换,执行速度块

自旋锁的缺点: 长时间占用处理器,会白白消耗 处理器资源,却没有干任何事情,性能浪费

                        所以自旋等待的时间必须有一定的限度 超过限度就挂起 线程

自旋默认的次数: 10次

 

4.可重入锁(递归锁)

可重入锁使一种技术,任意线程在获取到 锁之后能够再次 获取 该锁而不会被锁阻塞

原理 : 通过组合自定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值