synchronized 關鍵字與Lock 接口
#java #程式員 #面試 #圖文掘金計劃
synchronized關鍵字:
用于實作多線程同步,確定在同一時刻隻有一個線程可以通路被synchronized修飾的代碼塊或方法。
目的是防止多個線程同時修改共享資料導緻的資料不一緻性和競态條件問題。
在JVM層面實作,是隐式鎖,在進入synchronized代碼塊或方法時自動擷取鎖,在退出時釋放鎖。
Lock接口:
也用于多線程同步,相比synchronized提供更加靈活的操作。
使用Lock接口可以手動控制鎖的擷取和釋放,優化代碼執行性能。
支援更多進階特性,如可中斷的鎖、嘗試擷取鎖、逾時擷取鎖等。
在Java代碼層面實作,需要手動調用lock()方法擷取鎖,且在不需要鎖時必須手動調用unlock()方法釋放鎖。
Lock接口的靈活性:
允許手動擷取和釋放鎖,精确控制線程同步,提高性能。
提供了嘗試擷取鎖、逾時擷取鎖等功能,适用于複雜的同步場景。
支援公平鎖實作,按照請求順序擷取鎖,避免線程饑餓問題。
差別:
synchronized是在JVM層面實作,是隐式鎖,自動擷取和釋放鎖;Lock接口是在Java代碼層面實作,需要手動調用lock()和unlock()方法擷取和釋放鎖。
Lock接口提供了更多進階特性,如可中斷的鎖、嘗試擷取鎖、逾時擷取鎖等,在某些情況下更靈活。
使用Lock時需要更小心,確定在适當的地方釋放鎖,避免死鎖等問題。
其他使用場景:
除了保護共享資源,在多線程環境下,可以使用synchronized或Lock來實作讀寫鎖,提高讀取性能。
Java提供了ReentrantLock類,是synchronized的可重入版本,允許同一個線程多次擷取同一個鎖,避免自身死鎖問題。