java锁机制

1.乐观锁与悲观锁

 乐观锁

        乐观锁:在我的理解中,乐观锁就是在线程执行中,认为其他线程不会对我正在执行的线程产生影响,即读多写少的情况,采用的是无锁机制,即使用了数据版本检查的机制,每次更新都会检查更新前的版本和进行更新时的版本是否一致,一致则可进行修改,不一致则不能进行修改,由于这个机制,可以让我们在修改数据的时候可以查看数据,查看数据的时候查看的是一个快照版本的数据,它是在数据更新前拍了一个快照,使得我们可以同时进行修改和查看数据。采用了CAS机制和版本控制机制来进行实现,不单独使用CAS机制是因为会产生ABA问题。

悲观锁

        悲观锁:悲观锁就是在线程执行中,总认为其他线程会对我在执行的线程产生影响,所以必须加锁对我的线程进行保护,适用于高并发场景下保护某个数据同时被多个线程进行修改造成不一致的情况。

2.公平锁与非公平锁

 公平锁

        公平锁:在我的理解中,公平就是先来先得,后来的就得排队,而在线程中公平锁的用法也是如此,它会按照线程申请锁资源的顺序来给予锁给线程。这种锁不会产生饥饿线程,因为按顺序总会回去到锁资源,但会增大cpu的开销,因为每次唤醒线程的时候都是遍历整个线程队列找到第一个线程将它唤醒。

  非公平锁

        非公平锁:非公平锁就是线程来了就可以去争取锁资源了,不需要按排队的顺序,即使它刚来就可以直接去获取,这样会比公平锁中cpu唤醒线程的开销小,因为它不需要去遍历队列找到第一个,它所释放后就可以直接开始争夺资源,但会产生饥饿线程,因为是争夺锁资源,所以可能会有某些线程一直拿不到锁资源,一直处于阻塞状态

3.可重入锁

        可重入锁:可重入锁在我的理解中就是我在一个类中在一个加锁的方法中调用另外一个加锁的方法,此时,另外一个方法会加入我当前方法的线程中,此时两个线程id是一致的,那么我获取了当前方法的锁资源后,我就可以直接获取另外一个方法的锁,两个锁是一样的不会产生死锁的情况就是可重入锁,他会在对象头中增加和减少次数,上锁就加一,释放锁就会减一

4.分段锁

        分段锁:分段锁我认为理解它需要了解jdk1.7时候的ConcurrentHashMap,它使用的就是分段锁机制,每次put的时候会对这一段数据进行上锁,但你可以同时put多个数据,只要这些数据所处的段是不同的,即所处的hash表中的位置是不同的,但当你需要调用例如size()这些需要使用整个map的情况下,它需要获取整个map中的段锁才能进行操作

5.Sychornized

        在jdk1.5的时候引入了锁升级机制来高效的使用sychornized,因为之前sychornized使用的是重量级锁,会让线程在用户态和内核态进行切换,造成较大的开销,所以在1.5之后先是偏向锁,偏向锁,意思就是只有一个线程会对这个加锁的方法进行访问,那么每次只要检查这个线程对象头中是否有标记,有标记直接可以进入方法,当有第二个线程对该方法进行访问的时候,偏向锁会变为轻量级锁,轻量级锁表示我线程释放锁会很快,另外一个锁可以通过自旋的方式,不进行用户态和内核态的转换,通过自旋去尝试获取锁,减少开销,而重量级锁就是当线程自旋过久仍无法获取锁资源的时候会升级为重量级锁,让其进行阻塞。

6.Lock

        Lock锁与sychornized锁不同的是它是基于java代码进行实现的,而sychornized是基于JVM实现的,所以需要显示的去加锁和释放锁,其提供了多个实现类,可以实现公平锁和非公平锁

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值