请你讲述synchronized与 java.util.locks.Lock的相同与不同之处?

(1)、主要相同点:Lock能实现synchronized所实现的所有功能,即给线程加锁。

(2)、synchronized会自动释放锁,但Lock需要开发者在finally语句块中手工释放,Lock有比synchronized更好的性能和更精确的线程语义。

java中如何保证N个线程可以访问N个资源,但又同时不导致死锁?

可以指定获取锁的顺序,并强制N个线程按照指定的顺序获取锁。如果所有的线程都按照指定的顺序加锁和释放锁,就不会发生死锁。

请问什么是死锁?

两个或两个以上的线程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁,结果就是线程都陷入了无限的等待之中。

请说明下锁和同步的区别?

(1)、用法不同:synchronized可以加在方法上,也可以加在代码块上,是托管给JVM执行的。Lock则需要开发者自己指定加锁的起始位置和终止位置。

(2)、性能不同:Lock的性能优于synchronized关键字,并且Lock比synchronized有精确的线程语义,例如Lock的实现类ReentrantLock,不仅具有和synchronized相同的并发性和同步语义,还多了超时的获取锁,定时锁、等候和中断锁等。

(3)、锁机制不同:synchronized托管给JVM执行,获取锁和释放锁都是在块结构中,当获取多个锁时必须以相反的顺序释放锁,并且是自动解锁。Lock则必须由开发人员手动在finally语句块中释放锁,否则可能会引起死锁。

请说明下synchronized的可重入怎么实现?

每个锁关联一个线程持有者和一个计数器。当计数器为0时表示该锁没有被任何线程持有,此时任何线程都有可能获得该锁并且调用相应的方法。当一个线程请求成功后JVM会记下持有锁的线程,并将计数器记为1。当计数器为1时,其他线程请求该锁则必须等待。而该持有锁的线程如果再次请求该锁就可以拿到这个锁,同时计数器会递增。当线程退出一个synchronized方法或者代码块时,计数器会递减,如果计数器为0则释放该锁。

请讲一下公平锁和非公平锁在ReetrantLock里的实现过程是怎样的?

如果一个锁是公平的,则获取锁的顺序为发出请求的顺序。对于非公平锁,只要CAS设置同步状态成功,则表示当前线程获得了锁,而公平锁还要判断当前结点是否还有前驱结点,如果有,则表示有比当前结点线程更早请求锁资源的线程,因此需要等待前驱线程获取锁并释放后才能获取。
posted @ 2020-11-08 20:36  我是一只IT小菜鸟  阅读(122)  评论(0)    收藏  举报