分布式锁(深度挖掘)

思考:Java中有哪些锁?

1.按照是否要加锁分为:悲观锁和乐观锁
悲观锁:是要加锁的,像Synchronization就可以认为是悲观锁
乐观锁:是不加锁的,就是做了一个判断;就比如你在家房间里的门需要上锁的必要吗,就需要用乐观锁性能更高。
实例:mysql中有一个覆盖更新问题?
比如MySQL中有一个数据age=18,现在有两个线程都来改age,两个线程都需要做一个update(+1)操作,一个线程age+1=11,另一个县城age+1=12?为什么它等于12,因为被覆盖掉了;如何解决?加锁,使用悲观所和乐观锁都可以。

2.按照是否要阻塞分为:阻塞锁或者自旋锁
阻塞锁:当拿不到这个数据的锁,当前线程就会阻塞,直到被唤醒,相当于暂停这个线程的工作,让这个线程不会占用CPU时间,但缺点是线程恢复速度要比自旋锁慢,如Synchronization
自旋锁(不阻塞):当一个线程尝试去获取某一把锁的时候,如果这个锁此时已经被别人获取(占用),那么此线程就无法获取到这把锁,该线程将会自旋,间隔一段时间后会再次尝试获取。这种采用循环加锁 -> 等待的机制被称为自旋锁(spinlock),要注意:长时间自旋会空耗CPU(一直执行,一直拿不到锁,cpu一直被占着,CPU就一直没发干其它事情)
适应性自旋锁(不阻塞):在自旋锁的基础上自旋,尝试一定的次数还是获取不到锁就放弃获取锁,这种模式叫适应性自旋。
是否阻塞:多个线程同时要拿同一把锁,如果A线程先拿到锁,B线程就得等待,那么它的等待方式有多种,可以通过阻塞、自旋等方式来等待
jdk1.6之前Synchronization用的纯阻塞,性能很差,jdk1.6之后,Synchronization变了,会用到自旋,自旋到一定次数还拿不到锁,就会变成传统的阻塞。
总结:短时间自旋,性能高于阻塞的,长时间自旋,性能低于阻塞;线程竞争激烈的时候用阻塞锁(因为线程多,能把cup腾出来),不激烈的时候用自旋锁。

3.按照是否要排队加锁分为:公平和非公平锁
公平锁(排队加锁):多个线程都在竞锁时是否要按照先后顺序排队加锁,如果是那就是公平锁
非公平锁(不排队加锁):多个线程都在竞锁时不需要排队加锁(随机),是为非公平锁

4.按照是否可重入分为:重入锁和非重入锁
可重入锁:允许同一个线程多次获取同一把锁(不能,会出现死锁),是为可重入锁:比如一个递归函数里有加锁操作,递归过程中这个锁会阻塞自己吗?如果不会,那么这个锁就是可重入锁(因为这个原因可重入锁也叫做递归锁)。Java里只要以Reentrant开头命名的锁都是可重入锁Synchronization 也是可重入的
非可重入锁:一个线程在多个流程中不可用获取到同一把锁,是为非重入锁

5.按照锁的互斥特性分为

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值