黑马程序员技术交流社区
标题:
java 多线程 同步 锁 问题
[打印本页]
作者:
王小刚
时间:
2012-4-24 14:59
标题:
java 多线程 同步 锁 问题
请哪位高手能够帮忙讲解如下 java代码运行的过程?
有时候是 2000 b=1000;
有时候是 1000 b=1000(多数);
public class TT implements Runnable {
int b = 100;
public synchronized void m1() throws Exception{
//Thread.sleep(2000);
b = 1000;
Thread.sleep(5000);
System.out.println("b = " + b);
}
public synchronized void m2() throws Exception {
Thread.sleep(2500);
b = 2000;
}
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);
t.start();
tt.m2();
System.out.println(tt.b);
}
}
作者:
应佳锋
时间:
2012-4-24 16:18
我来告诉你为什么 因为你用了同步函数: 同步函数的锁是 类 就是你的TT类
地球人都知道线程是随机执行线程的 当 你 MAIN 线程先执行的时候 也就是说 他进入了m2()方法 那另外一条线程就不能进入m2()方法了只能在外面等待
Thread.sleep(2500);
只能等到睡眠时间过后再醒来才能去执行另外一条线程进入m1()方法
原因是:他们的锁都是同一个 而锁同一个的话也以为着 2个方法里一次性只能有 一条线程去执行
从某种意义上来说m2极有可能比m1先执行。
m2是直接调,m1是通过start()再去调。
OVER
作者:
周海诚
时间:
2012-4-24 16:33
同步函数也有锁。非静态同步函数的锁是this,同步函数所属对象的引用;静态同步函数的锁是:
类名.class,函数,所属类的字节码文件对象。
所以他们的锁都是同一个 所以有时候是 2000 b=1000;有时候是 1000 b=1000(多数);
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2