我试图理解 Java 中的“同步块”。我已经编写了非常基本的代码来查看如果我锁定和更改 thread_1 中的对象并通过另一种方法从另一个 thread_2(竞争条件)访问它会发生什么。但是我很难理解这种行为,因为我期望 Thread_1 会首先更改值,然后 Thread_2 会访问新值,但结果与我预期的不同。
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”对象?