Synchronized 與 ReentrantLock 的區別與聯絡
作為Java中舉足輕重的併發程式設計,同步是非常重要的機制;在Java中提供了JVM層面的 synchronized來保持同步;同時也提供了與synchronized非常相似的程式碼層面上的ReentrantLock 的同步機制。
那麼synchronized 和 ReentrantLock有區別和聯絡呢:
1、RentrantLock提供了synchronized的所有功能,而且比synchronized更加地靈活;
2、執行緒A和B都要獲取物件O的鎖定,假設A獲取了物件O鎖,B將等待A釋放對O的鎖定
synchronized :其中一個執行緒A獲取鎖,則B執行緒只能等待A釋放鎖;
ReentrantLock :提供了中斷功能,在等待一定時長之後可以中斷然後做其他的事情;
3、synchronized 線上程執行完畢之後會自動釋放鎖,而ReentrantLock需要手動釋放鎖 並且必須在finally塊裡釋放(原因是不在finally塊中釋放,如果發生異常則無法正常釋放鎖);
4、ReentrantLock 提供了很多方法 包括 lock() tryLock() unlock() 具體方法使用就不一一介紹,程式設計的學習已實踐為主,多寫寫程式碼多思考,自然而然就掌握了。
使用上講 ReentrantLock 提供了更大的靈活性,而且在併發量非常大的情況下效能會比synchronized 要好,而synchronized 使用比較方便簡潔。spring中很多地方都是用synchronized保持同步的。一般情況下用synchronized 足夠了,當然這只是個人見解。