面试-锁

一、请你简述一下synchronized与java.util.concurrent.locks.Lock的相同之处和不同之处?

答:相同点:Lock能完成synchronized所实现的所有功能;

不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动会释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。

二、Java中如何确保n个线程可以访问n个资源,但同时又不导致死锁?

答:使用多线程的时候,一种非常简单的避免死锁的方式就是:指定获取锁的顺序,并强制线程按照指定的顺序获取锁。因此,如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了。预防死锁,预先破坏产生死锁的四个条件。互斥不可能破坏,所以有如下三种方法:

①破坏请求和保持条件,进程必须等所有要请求的资源都空闲时才能申请资源,这种方法会使资源浪费严重。允许进程获取初期所需资源后,便开始运行,运行过程中再逐步释放自己占有的资源,比如有一个进程的任务是把数据复制到磁盘中再打印,前期只需获得磁盘资源而不需要获得打印机资源,待复制完毕后在释放掉磁盘资源。

②破坏不可抢占条件,这种方法代价大,实现复杂。

③破坏循环等待条件,对各进程请求资源的顺序做一个规定,避免相互等待。

三、请问什么是死锁?

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

例如,如果线程1锁住了A,然后尝试对B进行加锁,同时线程2已经锁住了B,接着尝试对A进行加锁,这时死锁就发生了。线程1永远得不到B,线程2也永远得不到A,并且它们永远也不会知道发生了这样的事情。为了得到彼此的对象(A和B),它们将永远阻塞下去,这种情况就是一个死锁。

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

答:用法上的不同:

synchronized即可以加在方法上,也可以加载特定代码上。而lock需要显示地指定起始位置和终止位置。

synchronized是托管给JVM执行的。lock的锁定是通过代码实现的,它有比synchronized更精确的线程语义。

性能上的不同:

lock接口的实现类ReentrantLock,不仅具有和synchronized相同的并发性和内存语义,还多了超时的获取锁、定时锁、等候和中断锁等。

锁机制不同:synchronized获取锁和释放锁的方式都是在块结构中,当获取多个锁时,必须以相反的顺序释放,并且是自动解锁。而lock则需要开发人员手动释放,并且必须在finally中释放,否则会引起死锁。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值