public class xiansan implements Runnable {
int b = 100;
public synchronized void m1() throws Exception {
b = 1000;
Thread.sleep(5000);
System.out.println("b = "+b);
}
public synchronized void m2() throws Exception {
Thread.sleep(2000);
b = 2000;
// System.out.println("-----------------------m2-------");
// System.out.println(this.b);
//System.out.println(b+"jjjjjjjjjjjjjjjjjjjjjjjjj");
}
public void run() {
try {
m1();
} catch(Exception e){
e.printStackTrace();
}
}
public static void main(String args[]) throws Exception {
xianer x = new xianer();
Thread t = new Thread(x);
// System.out.println(t.getPriority());
// System.out.println(Thread.currentThread().getPriority());
t.start();
x.m2();
System.out.println(x.b+"uuuuuuu");
// System.out.println(new Date(System.currentTimeMillis()));
}
}
通过测试,知道执行顺序是差不多m2->main->m1,不知道对不对,还有为什么t。start后,run方法不先执行呢,要等m2执行解锁后才运行,我觉得m1应该是最先的,我觉得应该 m1->m2
main
才对,
从输出结果来看呢,确实是m2-->main-->m1,
但是Thread.start(),此时线程处于就绪状态,并没有立即运行,
而是先运行Main线程(主线程),当主线程挂起的时候,Thread线程才开始运行,但是运行主线程的时候M2()方法已经把变量b锁住了,所以先运行M2()方法,如果不把M2()加锁的话,应该先运行M1()方法的。
package test;执行结果如下
prob.b 1 = 10
prob.b 2 = 10
M1 b=1000
M2 b=2000
prob.b 3 = 2000
希望你能明白。
追问我发现,我有点放迷糊了额 ,不确定m1先,还是m2先,因为这一句 System.out.println(x.b+"uuuuuuu");
运行多次,会发现结果不一样,这好像推翻了m2先的说法
如果主线程先运行,你说System.out.println(x.b+"uuuuuuu");
,这一句结果是什么?