黑马程序员技术交流社区
标题:
java线程锁问题
[打印本页]
作者:
李东城
时间:
2013-2-7 14:09
标题:
java线程锁问题
public class TT implements Runnable {
int b = 100;
public synchronized void m1() throws Exception{
//Thread.sleep(2000);
b = 1000;
Thread.sleep(1000);
System.out.println("b = " + b);
}
public synchronized void m2() throws Exception {
b = 2000;
Thread.sleep(10500);
System.out.println(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);
t.start();
tt.m2();
}
}
程序运行结果是2000
b = 1000,既m2先执行完,再执行m1方法。可2个方法都上锁了,应该是m1执行完才解锁后开始执行M2才对啊?
复制代码
作者:
张世钦
时间:
2013-2-7 15:22
同步函数是有作用的,只是线程间执行权的抢夺问题.
t.start();//开启t线程
tt.m2();//这一句可以理解为main()线程 也就是主线程.
在程序执行的过程中,主线程和t线程都有执行资格,
相互抢夺执行权
所以两个线程有可能执行,
如果主线程先执行的话,也就是tt.m2();这一句先执行,先打印2000,然后m1()再执行,打印b=1000
同步函数就是只要有人进来就上锁,所有用this锁的同步就都锁上了.
作者:
张庚
时间:
2013-2-7 15:37
public class TT implements Runnable {
int b = 100;
public synchronized void m1() throws Exception{
//Thread.sleep(2000);
b = 1000;
Thread.sleep(1000);
System.out.println("b = " + b);
}
public synchronized void m2() throws Exception {
b = 2000;
Thread.sleep(10500);
System.out.println(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);
t.start();
tt.m2();
}
}
程序运行结果是2000
b = 1000,既m2先执行完,再执行m1方法。可2个方法都上锁了,应该是m1执行完才解锁后开始执行M2才对啊?
因为抬头tt 和t 不是同一个对象 而同步函数的默认锁是this 不同对象的不同锁 这两个方法也就不同了 在说你那个也不是m1 是线程对象调用的 而M2方法就是普通的方法调用 所以你这个不存在同步。
作者:
李东城
时间:
2013-2-7 17:56
张庚 发表于 2013-2-7 15:37
public class TT implements Runnable {
int b = 100;
哦,是这样啊
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2