synchronized
是 Java 中用于實現線程同步的關鍵字,它可以用來修飾方法或代碼塊,確保同一時刻只有一個線程能夠執行被 synchronized
修飾的代碼。synchronized
鎖主要有以下幾種類型和應用場景:
對象鎖:
synchronized
修飾實例方法或代碼塊,鎖的對象是 this
。Class
對象,使用 synchronized
修飾靜態方法或代碼塊,鎖的對象是 ClassName.class
。類鎖:
synchronized
修飾靜態方法或靜態代碼塊時,鎖的是類的 Class
對象。這意味著同一時刻只有一個線程能夠執行該類的任何靜態同步方法或靜態同步代碼塊。方法鎖:
synchronized
關鍵字來實現。synchronized
的實現原理主要依賴于 JVM 中的 Monitor(監視器鎖),每個對象都有一個與之關聯的 Monitor。當線程嘗試獲取鎖時,它會嘗試通過 CAS(Compare and Swap)操作在對象頭的 Mark Word 中寫入鎖信息。如果 CAS 操作成功,線程將獲得鎖;如果失敗,說明有其他線程已經持有鎖,當前線程需要等待或自旋等待鎖的釋放。
synchronized
鎖會根據競爭情況在偏向鎖、輕量級鎖和重量級鎖之間升級:
synchronized
鎖的應用場景包括但不限于:
synchronized
確保同一時刻只有一個線程能夠訪問資源。Hashtable
、Vector
等線程安全的集合類,它們的方法通常使用 synchronized
來保證線程安全。synchronized
來確保實例的線程安全初始化。免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。