public class TT implements Runnable {
int b = 100;
public synchronized void m1() throws Exception{
//Thread.sleep(2000);
b = 1000;
Thread.sleep(5000);
//System.out.println("b = " + b);
}
public synchronized void m2() throws Exception {
Thread.sleep(6000);
b = 2000;
//System.out.println("b = " + b);
}
public void run() {
try {
m1();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
TT tt = new TT();
Thread t = new Thread(tt);
t.start();
tt.m2();
System.out.println(tt.b);
}
}为什么执行结果是1000,不应该m2是休眠6s,比m1要长,他应该是最后修改数据的,应该是2000啊!哪位大侠帮忙一下啊!
int b = 100;
public synchronized void m1() throws Exception{
//Thread.sleep(2000);
b = 1000;
Thread.sleep(5000);
//System.out.println("b = " + b);
}
public synchronized void m2() throws Exception {
Thread.sleep(6000);
b = 2000;
//System.out.println("b = " + b);
}
public void run() {
try {
m1();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
TT tt = new TT();
Thread t = new Thread(tt);
t.start();
tt.m2();
System.out.println(tt.b);
}
}为什么执行结果是1000,不应该m2是休眠6s,比m1要长,他应该是最后修改数据的,应该是2000啊!哪位大侠帮忙一下啊!
实际上m2先获得执行。
m2执行后,释放锁,m1得到执行的许可,所以m1的执行应该发生在:
tt.m2();
System.out.println(tt.b);
这两句话之间。
int b = 100; public synchronized void m1() throws Exception {
System.out.println("m1 before b = " + b);
b = 1000;
Thread.sleep(5000);
System.out.println("m1 after b = " + b);
} public synchronized void m2() throws Exception {
System.out.println("m2 before b = " + b);
Thread.sleep(9000);
b = 2000;
System.out.println("m2 after b = " + b);
} public void run() {
try {
m1();
} catch (Exception e) {
e.printStackTrace();
}
} public static void main(String[] args) throws Exception {
TT tt = new TT();
Thread t = new Thread(tt);
t.start();
// Thread.sleep(1000);
tt.m2();
System.out.println("TT.b = " + tt.b);
}
}
我改了点 你再跑跑看 就知道问题了
注释的部分 注释和不注释的话 结果是不一样的
在这段程序中如果加了 synchronized 就不会出现你期望的一个是暂停6秒一个暂停5秒,应该5秒先结束的情况.
如果不加synchronized 就铁定是你期望的2000t.start();tt.m2();
实际这两句,不一定谁先执行的.