一个程序问题。关于synchornized的

LOVEPANMEI 2010-02-22 02:03:54
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(6000);
b = 2000;
//System.out.println("b = " + 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();
System.out.println(tt.b);
}
}

为什么执行结果是1000,不应该m2是休眠6s,比m1要长,他应该是最后修改数据的,应该是2000啊!哪位大侠帮忙一下啊!
...全文
165 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxj828282 2010-02-23
  • 打赏
  • 举报
回复
top top top top
fatRoach 2010-02-22
  • 打赏
  • 举报
回复
^_^ 其实不是CPU说了算,而是JVM和OS的线程调度,不过为了简便,就写CPU啦!
fatRoach 2010-02-22
  • 打赏
  • 举报
回复
m2拿了对象锁说,我去睡6秒,回来干完事再把锁还给你^_^

m1干着急:你拿着锁我不能干事啊!我干完才睡觉,应该先给我才对啊!

CPU说:一边凉快去,锁给谁我说了算!
joezhpf 2010-02-22
  • 打赏
  • 举报
回复
出现1000的结果是因为,你用了 synchronized 当 tt抢到执行权后,就先执行 m2,就暂停 6秒,tt就阻塞了. 于是轮到线程t执行,因为遇到synchronized了,就发现tt还没有执行完,tt没有释放锁,所以 t不能继续执行.一直要等到 tt执行完后才能执行 m1.
在这段程序中如果加了 synchronized 就不会出现你期望的一个是暂停6秒一个暂停5秒,应该5秒先结束的情况.
如果不加synchronized 就铁定是你期望的2000

t.start();

tt.m2();
实际这两句,不一定谁先执行的.



aSysBang 2010-02-22
  • 打赏
  • 举报
回复
package demo;

public class TT implements Runnable {
int b = 100;

public synchronized void m1() throws Exception {
System.out.println("m1 before b = " + b);
b = 1000;
Thread.sleep(5000);
System.out.println("m1 after b = " + b);
}

public synchronized void m2() throws Exception {
System.out.println("m2 before b = " + b);
Thread.sleep(9000);
b = 2000;
System.out.println("m2 after b = " + 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();
// Thread.sleep(1000);
tt.m2();
System.out.println("TT.b = " + tt.b);
}
}


我改了点 你再跑跑看 就知道问题了
注释的部分 注释和不注释的话 结果是不一样的
bayougeng 2010-02-22
  • 打赏
  • 举报
回复
在m1和m2的开头各加上一句print就明白了。
实际上m2先获得执行。
m2执行后,释放锁,m1得到执行的许可,所以m1的执行应该发生在:
tt.m2();
System.out.println(tt.b);
这两句话之间。
bobo364 2010-02-22
  • 打赏
  • 举报
回复
在一次结速后在跑一次就是2000了,你用了synchronized,在run方法中的m1先运行,在运行m2,但很有可能第一次运行是程序被jvm给结速了,多线程问题很搞,还看高手在答
小贝壳666 2010-02-22
  • 打赏
  • 举报
回复
t.start(); 并不是马上开始,应该是放到线程池中,处于等待状态。等着被CPU调度

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧