synchronized是Java的關鍵字,當它用來修飾一個方法或者一個代碼塊的時候,能夠保證在同一時刻最多隻有一個線程執行該段代碼。JDK1.5以後引入了自旋鎖、鎖粗化、輕量級鎖,偏向鎖來有優化關鍵字的性能。
Lock:JDK5新增了 Lock接口和實現類ReentrantLock(重入鎖),利用lock()【阻塞式】,tryLock()【非阻塞式】,lockInterruptibly()【獲得了鎖就返回,否則線程就休眠,知道獲得鎖】。
使用lock前先:
Lock lock = new ReentrantLock();
再用lock進行加鎖(lock.lock())和釋放鎖(lock.unlock() )。
區別:
1、Synchronized可以加在方法上,也可以加載代碼塊上,而Lock要顯式的制定起始位置,即lock()和unlock()。Synchronized是託管給JVM的,Lock的鎖定是通過代碼實現的。
2、競爭不激烈時,Synchronized性能優於ReentrantLock,競爭激烈時,Synchronized性能差。
3、Synchronized會自動釋放鎖,而Lock需要在finally塊中手動釋放鎖。