package com.KnightX;public class TT implements Runnable {
int b = 100;
public synchronized void m1() throws Exception{
//Thread.sleep(2000);
System.out.println("m1");
b = 1000;
Thread.sleep(5000);
System.out.println("b = " + b);
}
public synchronized void m2() throws Exception {
System.out.println("m2");
Thread.sleep(2500);
b = 2000;
System.out.println("2b"+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);
//tt.m1();
t.start();
//Thread.sleep(100);
tt.m2();
System.out.println(tt.b);
}
}上述代码中,m1,m2是同步方法,输出的结果是:
m2
2b2000
2000
m1
b = 1000
我不明白为什么m2比m1先执行,t.start()这行代码是在tt.m2()之前的,我感觉应该是m1先拿到锁的
求指点~~谢谢
int b = 100;
public synchronized void m1() throws Exception{
//Thread.sleep(2000);
System.out.println("m1");
b = 1000;
Thread.sleep(5000);
System.out.println("b = " + b);
}
public synchronized void m2() throws Exception {
System.out.println("m2");
Thread.sleep(2500);
b = 2000;
System.out.println("2b"+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);
//tt.m1();
t.start();
//Thread.sleep(100);
tt.m2();
System.out.println(tt.b);
}
}上述代码中,m1,m2是同步方法,输出的结果是:
m2
2b2000
2000
m1
b = 1000
我不明白为什么m2比m1先执行,t.start()这行代码是在tt.m2()之前的,我感觉应该是m1先拿到锁的
求指点~~谢谢
而 m1 是在一个新建的线程里, 启动后在"可运行"状态,需要等待JVM的调度变成"运行"状态. 所以是m2先运行.
个人浅见.