首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

关于Java 锁的有关问题,小弟我刚学不懂,求指点

2012-01-12 
关于Java 锁的问题,我刚学不懂,求指点package com.KnightXpublic class TT implements Runnable {int b

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

热点排行