日期:2014-05-20  浏览次数:20751 次

关于Java 锁的问题,我刚学不懂,求指点
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先拿到锁的。。。
求指点~~谢谢

------解决方案--------------------
多线程的运行是不确定的。一个是在主线程一个是在子线程。
------解决方案--------------------
楼上正解。
其实你这个问题跟锁没什么关系,因为你两个线程中调用的不是一个方法。
你的程序中m1和m2两个方法是并行执行的,虚拟机调度的时候时间片是按照一定的比例随机分配的。所以每次的运行结果都有可能不一样。
------解决方案--------------------
这个执行结果是不确定的,线程执行不是哪个先start就先执行哪个,是不确定的
------解决方案--------------------
多线程比较繁,太多不确定性。