首页 > 试题广场 >

锁有了解嘛,说一下Synchronized和lock

[问答题]
synchronized是Java的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。JDK1.5以后引入了自旋锁、锁粗化、轻量级锁,偏向锁来有优化关键字的性能。 Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现;synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁;Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断;通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。
发表于 2019-05-02 00:52:57 回复(0)
更多回答
这道题应该是看你对于这俩者的区别和优缺点还有使用场景上的注意。
首先lock是接口synchronized是关键字,然后lock是显示锁(即加锁和解锁的过程可见并且需要我们自己控制)S是隐式锁。然后S可以用来修饰方法代码块。Lock的话需要它的一些实现类来做到加锁和解锁比如我们很长用的ReentrantLock或者分布式领域会用到的ReentrantReadWriteLock。用法上的话,一般我们S的话不怎么需要关注他的锁释放,因为代码块执行完毕或者报错都会释放锁,而lock的话我们通常需要使用trycatchfinally这种形式在finally中去unlock释放锁。另外S在读写锁方面没有Lock灵活,设想一下ABC三个线程,俩个读文件一个写文件,如果是S的你只能依次来加锁解锁,而Lock可以让读
共享,这样不是很好嘛。
另外S在1.6之前的话是重量级锁,性能远不如ReentrantLock,在1.6以后做了大幅的优化,引入了偏向锁,轻量级锁,自旋锁,自适应自旋,锁粗化,锁消除等机制,具体想看优化详细的话可以参考书籍周志明老师的深入理解java虚拟机的最后一章。
最后提一点,S和ReentrantLock都属于可重入锁。
发表于 2019-02-26 09:18:36 回复(0)
发表于 2019-05-05 09:34:55 回复(0)
java锁中的两个基本工具
发表于 2019-02-25 13:29:12 回复(0)
两者的功能相差不大
发表于 2019-03-25 11:15:25 回复(0)
话说你们回答时,也和自己敲键盘时的答案一直吗。。。。不懂怎么去表达啊。。。求教
发表于 2019-09-21 17:38:35 回复(0)