互聯網上的很多文章指出,在多線程中使用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要執行的整個方法作爲一個事務一個共同的字符串同步兩種方法(防止其他方法甚至讀取數據庫)。但在數據庫級別執行此操作會導致死鎖(不會阻止讀取訪問)。在這種情況下使用字符串實習生進行同步是否有瓶頸或死鎖問題?有沒有其他方法可以解決這個問題? 原諒我的任何不便或格式不正確。
如果使用String進行同步還不夠糟糕,可以這樣做:P https://vanilla-java.github.io/2016/04/21/Bad-String.html –
這顯然是一個[xy問題] (http://meta.stackexchange.com/a/66378/166789)。你應該問自己,一個單一的全局數據庫鎖如何在正常情況下導致死鎖,這是不可能的。由於鎖對象不能修復軟件中的邏輯錯誤,所以必須至少有兩個鎖用於死鎖並使用interned字符串。 – Holger
感謝您的回答,併爲您帶來不便。我真的不知道xy問題,但是要求專家提出有關提議解決方案的意見,以及針對同一問題的不同方法不是很好? –