我想了解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',以确保同步对象保持不变。 –