我在這里運行 safe1 方法時看到了一些多執行緒問題:
public class Test {
private static final Object lock = new Object();
public void safe1() {
//Some non thread safe code
synchronized (lock) {
//Some thread safe code
}
//Some non thread safe code.
}
public void safe2() {
//Some non thread safe code
synchronized (lock) {
//Some thread safe code
}
//Some non thread safe code.
}
}
我在想它的行為與這段代碼相同。
public class Test {
public void safe1() {
//Some non thread safe code
synchronized (Test.class) {
//Some thread safe code
}
//Some non thread safe code.
}
public void safe2() {
//Some non thread safe code
synchronized (Test.class) {
//Some thread safe code
}
//Some non thread safe code.
}
}
那是對的嗎?我想確保沒有 2 個執行緒在 VM 范圍內運行相同的“安全代碼”。
uj5u.com熱心網友回復:
不同之處在于有人可以撰寫獲取鎖的代碼,例如
synchronized(Test.class) {
并且能夠在不呼叫 Test 物件的方法的情況下獲取鎖。應用程式中的任何任意代碼都可以獲取鎖,并可能阻止使用它的其他代碼繼續進行。鎖定私有欄位會使事情變得更加困難,代碼必須通過反射來獲取私有欄位,并且可以配置安全管理器來防止這種情況發生。
否則,鎖的作用域是相同的,您一次允許一個執行緒跨越整個類加載器的 Test 類的所有實體。所以創建更多的測驗實體對你的并發水平沒有幫助。如果您正在保護實體資料,那么這似乎是不必要的限制。鎖定范圍應與您阻止并發訪問的資料的范圍相同。
如果 Test 類由兩個不同的類加載器加載,那么您將擁有 Test 類的兩個單獨副本。Test.class 在整個應用程式中是否唯一取決于應用程式如何使用類加載器。但是就這一點而言,您的任何一種方法都不是可取的。
uj5u.com熱心網友回復:
此代碼不允許任何其他執行緒訪問 jvm 的同一類加載器。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/422749.html
標籤:
