java之synchronized与lock

最近在读《java并发编程实践》这本书,更加深入的了解了内部锁(synchronied)与显示锁(lock)的区别。以前以为java 5.0出来的lock是来替代synchronied的,其实不然,看下面《java并发编程实践》的一段话。

     1,内部锁相比于显示锁仍然具有很大的优势。这个标示更为人们所熟悉,也更简洁,而且很多现有的程序已经在使用内部锁了------混合这两者会造成混淆,反而并更易发生错误。

      2,在java 5.0中,内部锁与reentrantLook相比,还具有另外一个优点:线程转储能够显示那些个调用框架获得了那些锁,并能够识别发生了死锁的那些线程。JVM并不知道哪个线程持有reentrantLook,因此在调试使用reentrantLook的线程间存在的问题时,无法从中获取帮助。这个问题在java6中得到了解决,它提供了一个管理和调试接口,锁可以使用这个接口进行注册,并通过其他管理和调试接口,从线程转储中得到reentrantLook的加锁信息。这些用于调试的消息的可用性对于synchronized是有优势的。

      3,未来的性能改进可能更倾向于synchronized而不是reentrantLook。因为synchronized是内置于JVM的,它能够进行优化,比如对线程限制的锁对象的锁省略(lock elision),粗化锁来减小内部锁的同步性;使用基于类库的锁来实现这些看起来可能性不大。

以上为《java并发编程实践》中所写。

具体该怎么选择:

在内部锁不能够满足使用时,reentrantLook才被作为更高级的工具,当你需要以下高级特性时,才该使用:可定时的,可轮训的与可中断的锁获取操作,公平队列,或者非块结构的锁,否则,请使用synchronized。

猜你喜欢

转载自mr-ziha.iteye.com/blog/2281728