简述一下Synchronize和Lock的区别
Lock能完成Synchronize的所有功能
Lock有精准的语法和性能,Synchronize会自动释放锁,而lock需要手工释放,必须在finally中释放。
如果确保N个线程访问N个资源,但是又不导致死锁
可以指定获取锁的顺序,所有县城都以同样的顺序获取锁和释放锁。
什么是死锁
两个以上线程都在等待对方执行。陷入了无限等待。
说明一下锁和同步的关系
Synchronize可以加在方法上,也可以加在代码块上。
Lock需要制定起始位置和终止位置。
Synchronize是交给JVM执行,而lock是通过代码实现
性能方面:竞争很激烈的情况下Synchronize的性能下降非常快。而Lock则基本不变。
自动解锁和人工解锁也有区别。
说明一下Synchronize可重入怎么实现的
每个锁关联一个线程持有者和一个计数器。计数器为0则释放锁,当一个线程请求成功后,JVM会记下持有锁的进程,计数器加1,其他线程等待。线程退出时,计数器减少。
公平锁和非公平锁
公平锁:锁的顺序根据指定顺序获取。公平锁需要判断当前节点的前驱节点有没有,如果有,还需要等待前驱线程释放锁
非公平锁:只要谁知同步状态成功就行。