public class TT implements Runnable {
int b=100;
public void run() {
try {
m1();
} catch (Exception e) {
e.printStackTrace();
}
}
public synchronized void m1() throws Exception{
b=1000;
Thread.sleep(5000);
System.out.println("b="+b);
}
public void m2() throws Exception{
Thread.sleep(2500);
b=2000;
}
public static void main(String[] args) throws Exception {
TT tt=new TT();
Thread t=new Thread(tt);
t.start();
tt.m2();
}
}输出b=2000;
m2方法前面 synchronized,输出b=1000;为什么是这两种结果,请大家帮忙分析一下。谢谢
int b=100;
public void run() {
try {
m1();
} catch (Exception e) {
e.printStackTrace();
}
}
public synchronized void m1() throws Exception{
b=1000;
Thread.sleep(5000);
System.out.println("b="+b);
}
public void m2() throws Exception{
Thread.sleep(2500);
b=2000;
}
public static void main(String[] args) throws Exception {
TT tt=new TT();
Thread t=new Thread(tt);
t.start();
tt.m2();
}
}输出b=2000;
m2方法前面 synchronized,输出b=1000;为什么是这两种结果,请大家帮忙分析一下。谢谢
第二种情况,由于m1和m2都是synchronized的,所以他们的执行是原子的,即不会相互交叉的。在m1中b=1000,之后该线程会一气执行完println,之间不会执行m2的。
t和tt在同时睡觉前,t把b修改成1000
tt比t早醒,然后tt把b修改成了2000
t醒来后说出b的值