2016-09-02 50 views
0

互聯網上的很多文章指出,在多線程中使用String.intern()是壞的,但我真的不明白爲什麼它不好。使用String.intern()總是從字符串池中返回一個唯一的字符串,不是嗎? 如果不是這樣的話JVM字符串池線程是本地的嗎?如果沒有,那麼爲什麼在多線程環境中使用String.intern()進行同步被認爲是不好的?所以在下面的用例,也不會是解決同步問題:JVM字符串池線程本地?它會導致這個用例的任何問題嗎?

Method1 { 
synchronized(Interned string) { 

    select method { 
    select query to databse 
    } 
    ...some processing... 

    update method { 
    update query to database 
    } 
}  
} 

Method2 { 
synchronized(Interned string) {   
    select method { 
    select query to databse 
    } 
    .....some processing.... 

    insert method { 
    insert query to database 
    } 
}  
} 

在這裏,我根據id.I要執行的整個方法作爲一個事務一個共同的字符串同步兩種方法(防止其他方法甚至讀取數據庫)。但在數據庫級別執行此操作會導致死鎖(不會阻止讀取訪問)。在這種情況下使用字符串實習生進行同步是否有瓶頸或死鎖問題?有沒有其他方法可以解決這個問題? 原諒我的任何不便或格式不正確。

+0

如果使用String進行同步還不夠糟糕,可以這樣做:P https://vanilla-java.github.io/2016/04/21/Bad-String.html –

+0

這顯然是一個[xy問題] (http://meta.stackexchange.com/a/66378/166789)。你應該問自己,一個單一的全局數據庫鎖如何在正常情況下導致死鎖,這是不可能的。由於鎖對象不能修復軟件中的邏輯錯誤,所以必須至少有兩個鎖用於死鎖並使用interned字符串。 – Holger

+0

感謝您的回答,併爲您帶來不便。我真的不知道xy問題,但是要求專家提出有關提議解決方案的意見,以及針對同一問題的不同方法不是很好? –

回答

1

沒有,interned字符串在JVM中全局可用。

因爲它說,在this answer

對實習生串同步實際上是一個非常糟糕的主意 - 部分是因爲創造實習生字符串被允許使它們永遠存在......

即你可能會創建數量不斷增長的鎖。

......部分原因是如果程序中任何位置的多個代碼在實際字符串上進行同步,則這些代碼位之間存在依賴關係,並且可能無法防止死鎖或其他錯誤。

的字符串整個JVM是可見的,所以任何事情,任何地方都可以嘗試在相同的字符串同步,造成難以複製,難以解決問題。

相關問題