最近在整理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
站在巨人的肩膀上,共同学习!