在Java 中同步字串物件
簡介:
在多執行緒上應用程式中,同步程式碼區塊對於確保正確和一致的行為至關重要。但是,同步物件的選擇可能會影響程式碼的正確性和效能。本文探討了 String 物件同步的後果,這是一種常見但可能有問題的做法。
String 物件和身分:
與基本類型不同,String 物件是不可變的,並且透過參考採取行動。雖然具有相同值的兩個 String 物件可能看起來相同,但它們在記憶體中不一定是同一個物件。
字串同步問題:
當多個執行緒時在同一個String 物件上同步,它們有效地序列化對受該同步保護的程式碼區塊的訪問。但是,如果在程式中多次建立關鍵 String 對象,則由於參考不匹配,每個執行緒可能會錯誤地認為自己具有對該區塊的獨佔存取權。
同步範例:
考慮以下範例程式碼,它嘗試使用String 同步對快取的存取key:
private SomeData[] getSomeDataByEmail(WebServiceInterface service, String email) { final String key = "Data-" + email; synchronized(key) { // ... // } return data; }
在此範例中,即使每次呼叫getSomeDataByEmail 使用唯一的String 鍵,多個執行緒仍可能進入同步區塊,因為它們沒有引用同一個String對象。
解 1:實習字串鍵
一個解法是使用 intern() 方法在鍵 String 物件上。此方法可確保 JVM 中只存在一個具有特定值的 String 實例。透過在 interned key 上進行同步,您可以有效地保證所有執行緒都引用同一個物件。
解決方案 2:使用鎖定物件
更強大的解決方案是為每個金鑰建立一個專用的鎖定物件。執行緒不是在鍵本身上進行同步,而是取得與鍵關聯的鎖。無論鍵實例的數量如何,此方法都提供一致的同步點。
結論:
如果無意中創建了 String 對象,則同步可能會導致並發問題多次。為了確保可靠的執行緒安全,請考慮使用 interned String 鍵或為每個鍵實作專用的鎖定物件。了解物件同步選擇的含義對於開發高效且正確的多執行緒 Java 程式碼至關重要。
以上是為什麼在 Java 中同步字串物件是一個壞主意?的詳細內容。更多資訊請關注PHP中文網其他相關文章!