Synchronized与Lock及相关锁知识串联梳理

最近在整理Synchronized和lock的区别,想起了许多其他相关的知识,这里串联一下,形成知识架构。

主要区别有一下几点:
1、实现层次:Syn是基于JVM层,java内置的关键字。在程序编译阶段会在代码块前形成moitorecter、代码后形成moitorexit标识;lock笼统的说是一个java接口,因为Lock有不同的实现类;
2、锁的获取/阻塞:Syn是当获得锁的线程等待某种资源时(类似IO资源),其他线程将会被进行上下文切换放进等待队列;当进行读读操作的时候也只能有唯一的线程访问,其它线程等待;Lock线程不用一直等待;
3、释放锁:Syn只能是当线程执行完毕或者抛出异常才能释放锁资源;Lock则是fianlly{}模块进行手动释放,若不释放,将引起死锁。
4、锁状态:Syn是不可判断;Lock则是可判断;
5、锁类型:Syn是可重入、不可中断、非公平;Lock是可重入、可中断、可公平的;

总的来说,Syn是对对象实例加锁,也就是相对的代码块,相当与对一个线程集合加锁;而Lock相当与对对象实例中一个集合中的每个线程加锁,对于集合中线程中非共享资源的情况是不存在竞争关系的。

上面叙述的有个别名词,这里解释一下:
1、可重入锁

相对其他的解释,这个最靠谱:
可重入锁指的是在一个线程中可以多次获取同一把锁,比如:
一个线程在执行一个带锁的方法,该方法中又调用了另一个需要相同锁的方法,则该线程可以直接执行调用的方法,而无需重新获得锁;
而我所理解的是,不需重新获得锁的同时,记录了加锁的次数,从而保证不会出现外层锁在内层递归函数中释放的情况。
更详细的源码在这里:http://www.jb51.net/article/57338.htm
2、公平锁

公平锁即尽量以请求锁的顺序来获取锁。比如同是有多个线程在等待一个锁,当这个锁被释放时,等待时间最久的线程(最先请求的线程)会获得该所,这种就是公平锁。

  非公平锁即无法保证锁的获取是按照请求锁的顺序进行的。这样就可能导致某个或者一些线程永远获取不到锁。

  在Java中,synchronized就是非公平锁,它无法保证等待的线程获取锁的顺序。
在可重入锁的源码中实现有一个compareAndSet(CVS)乐观锁的函数实现,下面将详细说一下这个;
不过这个要从AtomicInteger类compareAndSet说起:
https://blog.csdn.net/u013404471/article/details/47297123

https://blog.csdn.net/bohu83/article/details/51124065

站在巨人的肩膀上,共同学习!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魏小言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值