Java中的锁机制

1. 公平锁和非公平锁
公平锁: 指按照申请锁的顺序来获取锁
非公平锁: 线程获取锁的顺序不一定按照申请锁的顺序来(默认非公平锁)
非公平锁的优点是吞吐量大
e.g.:Synchronized就是一种非公平锁
2. 可重入锁(递归锁)
指在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁
可重入锁的一个好处是可一定程度避免死锁。
例如 :加锁的方法中调用另一个被加锁的方法,如果不是可重入锁不可能执行成功
e.g: Re entrant Lock Synchronized
3. 共享锁和独享锁
共享锁:线程可以被多个线程公有
独享锁:一次只能被一个线程访问
e.g.: Re entrant Lock Synchronized 是独享锁 ReadWriteLock中读锁是共享锁,写锁是独享锁
4. 乐观锁和悲观锁 (看待并发同步的角度)
乐观锁:默认对一个数据的操并发,不发生修改。在更新数据的时候,会尝试采用不断更新重入的方式更新数据。
悲观锁:默认对一个数据的并发操作,一定会发生修改,因此对于同一个数据的并发操作,悲观锁采用加锁机制。悲观锁认
为,不加锁的操作一定会发生问题。
e.g.: 悲观锁在Java中就是利用各种锁, 乐观锁在Java中 的使用,是无锁编程, 常采用CAS算法
5. 分段锁(锁的设计)
CocurrentHashMap,降低锁的粒度
当需要put元素时,并不是对整个hashmap加锁,而是通过hashcode获取其存放的位置,对分段进行加锁,对于不同的线程,只要不是放在同一个分段,就实现了并行插入
6. 偏向锁 轻量级锁 重量级锁 (指的是锁的三种状态)
偏向锁: 一段同步代码一直被一个线程所访问,那么该线程自动获取锁,降低获取锁的代价。
轻量级锁:当偏向锁被另一个线程访问,偏向锁会升级为轻量级锁,其他线程会通过自旋锁的方式尝试获取锁,不会阻塞
重量级锁:当锁为轻量级锁是,另一个线程虽然自旋,但自旋不会一直持续,当自旋一定次数时,还没有获取到锁,就会进入阻塞,该锁成为重量级锁,其他线程访问时会直接进入阻塞,性能降低。
7. 自旋锁
尝试获取锁的线程不会立即阻塞,而是采用循环的方式去获取锁。优点是减少了线程的上下文切换消耗,缺点是会消耗CPU

synchronized 和 ReentrantLock的区别

  1. ReentrantLock可以通过tryLock()设置超时时间,如果超时未获取到锁就会放弃
  2. ReentrantLock可以设置公平锁和非公平锁
  3. ReentrantLock可以获得正在等待线程的个数,计数器等
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值