我想了解Java中的「synchronized block」。我寫了非常基本的代碼,看看如果我鎖定並更改thread_1中的對象並通過另一種方法從另一個thread_2(競爭條件)訪問它,會發生什麼情況。但是我很難理解這種行爲,因爲我期待Thread_1會先改變值,然後Thread_2會訪問新值,但結果並不如我預期的那樣。Java中的對象鎖
public class Example {
public static void main(String[] args){
final Counter counter = new Counter();
Thread threadA = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("THREAD_1_START");
counter.add(1);
System.out.println("THREAD_1_END");
}
});
Thread threadB = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("THREAD_2_START");
System.out.println("GET_A_BY_THREAD_2:"+counter.getA(2));
System.out.println("THREAD_2_END");
}
});
threadA.start();
threadB.start();
}
}
public class Counter{
String A = "NONE";
public void add(long value){
synchronized (A) {
System.out.println("LOCKED_BY_"+value);
for(int i = 0; i < 1000000000; i++){}
setA("THREAD_"+value);
System.out.println("GET_A_BY_THREAD:"+getA(value));
}
}
public void setA(String A){
System.out.println("Counter.setA()");
this.A = A;
System.out.println("Counter.setA()_end");
}
public String getA(long value){
System.out.println("Counter.getA()_BY_"+value);
return this.A;
}
}
的輸出是:
THREAD_1_START
THREAD_2_START
LOCKED_BY_1
Counter.getA()_BY_2
GET_A_BY_THREAD_2:NONE
THREAD_2_END
Counter.setA()
Counter.setA()_end
Counter.getA()_BY_1
GET_A_BY_THREAD:THREAD_1
THREAD_1_END
Thread_1鎖定 「A」 的字符串對象,並改變它,但Thread_2可以讀取的值在改變之前。當「A」處於鎖定狀態時,thread_2如何訪問「A」對象?
除了已經給出的答案,您可以將'String a'標記爲'final',以確保同步對象保持不變。 –