Java常见锁策略

Java常见锁策略

一* 悲观锁vs乐观锁:两种不同的加锁态度

悲观锁: 对数据被外界修改持保守态度,认为数据很容易被其他线程修改,所以在数据被处理前先对数据进行加锁,并在整个数据梳理过程中,使数据处理锁状态。(预测锁冲突的概率较高,因此做的工作要复杂一些)
乐观锁: 相对于悲观锁来说,它认为数据在一般情况下不会轻易被其他线程修改,所以在访问前不会加排他锁,而是在进行数据提交更新的时候,才会正式对数据冲突与否进行检测。(预测锁冲突概率不高,因此做的工作简单一些)

二*读写锁vs普通互斥锁

普通互斥锁: 类似synchronized就是普通互斥锁,当两个线程竞争同意一把锁,就会产生等待。
读写锁: 分成两种情况,一是加读锁,二是加写锁,读锁和读锁之间不会产生竞争,写锁和写锁之间有竞争,读锁和写锁之间有竞争,且读的场景远远多于写的场景,读写锁相比于普通的互斥锁就少了很多的锁竞争,优化了效率。

三*重量级锁vs轻量级锁

重量级锁: 加锁解锁开销比较大,典型的,进入内核态的加锁逻辑,开销是比较大的。
轻量级锁: 加锁解锁开销比较小,典型的,纯用户态的加锁逻辑,开销比较小的。
注意: 重量级锁和轻量级锁是站在加锁和解锁的结果看待的,最终加锁和解锁操作消耗的时间是多还是少?而悲观锁和乐观锁是站在加锁和解锁的过程中看待的,最后是加锁和解锁做的工作是多还是少?一般来说,干的工作多,消耗的时间就多,故一般乐观锁一般比较轻量,悲观锁一般比较重量。

四*挂起等待锁vs自旋锁

挂起等待锁: 由于Java中的线程和操作系统中的线程是一 一对应的,所以当一个线程在获取锁失败后,会被切换到内核态被挂起。当该线程获取到锁时又需要将其切换到内核态而唤醒该线程,从用户态切换到内核态的开销比较大,在一定程度上会影响并发性能。(是轻量级锁的一种典型实现
自旋锁: 当前线程在获取锁时,如果发现锁被其他线程占有,它并不会马上阻塞自己,在不放弃CPU使用权的情况下,多次尝试获取锁,有可能在后面其他线程会释放了锁。只有在指定次数后仍没获取到锁,当前线程才会被阻塞挂起。可以看出,自旋锁是使用占用CPU的时间换取线程阻塞和调度的开销,这样也会有问题,如果其他线程没有释放锁,这些CPU占用的时间白白浪费了。(是重量级锁的一种典型实现

五*公平锁vs非公平锁(线程获取锁的抢占机制)

公平锁: 表示线程获取锁的顺序是按照线程请求锁的时间早晚来决定的,也就是最早请求锁的线程将最早获取到锁。(先来后到)(ReentrantLock pairLock = new ReentrantLock(true))
非公平锁: 表示线程获取锁的顺序在其他线程闯入后,对于线程获取到锁的顺序并不是先来后到,而是随机调度。操作系统默认就是非公平锁(ReentrantLock pairLock = new ReentrantLock(false))
注意: 想要实现公平锁,是需要引入额外的数据结构,来记录线程加锁的顺序的,需要一定的额外开销。

六*可重入锁vs不可重入锁

可重入锁: 线程可以再次获取自己所持有的锁且不会被阻塞(同一个线程针对同一把锁可以连续加锁多次,不会死锁)例如:synchronized就是可重入锁
不可重入锁: 线程不可以再次获取自己所持有的锁,将会阻塞等待(同一个线程针对同一把锁连续加锁多次,就会死锁)

七* 独占锁vs共享锁

独占锁: 保证任何时候都只有一个线程能得到锁(ReentrantLock就是以独占的方式实现的)。独占锁其实是一种悲观锁,由于每次访问资源都先加上了互斥锁,这限制了并发性,但是其实读操作并不会影响数据的一致性,而独占锁只允许在同一时间由一个线程读取数据,其他线程必须等待当前线程释放锁才能进行读取。
共享锁: 可以同时有多个线程持有(ReadWriteLock读写锁,它允许一个资源可以被多线程同时进行读操作)共享锁则是一直乐观锁,它放宽了加锁条件,允许多个线程同时进行读操作。

总结一下synchronized的锁策略:
1.既是悲观锁,也是乐观锁
2.既是轻量级锁,也是重量级锁
3.乐观锁的部分是基于自旋锁实现的,悲观锁的部分是基于挂起等待锁实现的
4.不是读写锁,是普通互斥锁
5.是非公平锁
6.是可重入锁
7.是独占锁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值