关于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就先执行哪个,是不确定的
------解决方案--------------------多线程比较繁,太多不确定性。