java的线程问题。一个类里有两个方法,两个方法都使用了关键字synchronized,他们的执行顺序是怎么样的?

publicclassTTimplementsRunnable{intb=33;publicsynchronizedvoidm1()throwsException{b=1... public class TT implements Runnable {
int b = 33;
public synchronized void m1() throws Exception {
b = 101;
Thread.sleep(2);
System.out.println("m1.Thead= "+b);
}

public synchronized void m2() throws Exception {
Thread.sleep(2000);
b=2000;
}

public void run() {
try{
m1();
} catch (Exception e) {
e.printStackTrace();
}
}

public static void main (String[] args) throws Exception {
TT x = new TT();
Thread t = new Thread(x);

x.m2();
t.start();
System.out.println("main.b= "+x.b);

}
}
这样顺序的时候,执行结果是:
main.b=101 //问题一:x.m2先执行的,为什么输出结果main方法的在前面?
m1.b=101

如果main方法里x.m2();和t.start();换一下顺序
t.start();
x.m2();

问题二:这样的执行结果就是有时候:
main.b=2000
m1.b=101
有时候跟第一次执行结果一样,为什么呢?
展开
 我来答
sunguichun2003
2016-06-02 · TA获得超过752个赞
知道小有建树答主
回答量:754
采纳率:0%
帮助的人:514万
展开全部
问题一:x.m2先执行的,为什么输出结果main方法的在前面?答:这时的x.m2()执行结果的b值马上被t.start()启动后执行的m()方法给覆盖(2000变成了101),m1在sleep时,当然先输出System.out.println("main.b= "+x.b)这句了。

问题二:这样的执行结果就是有时候:
main.b=2000
m1.b=101
有时候跟第一次执行结果一样,为什么呢?
答:你这里的同步设定没有意义,例如m1加了synchronized ,当m1被调用并未执行完时,其他线程不能调用执行该方法,但这与m2无关,同样,当m2执行时,也与m1无关,这样由于sleep的时间差异,输出结果的变化也在情理之中了。
nicememory
推荐于2018-03-26 · 知道合伙人互联网行家
nicememory
知道合伙人互联网行家
采纳数:326 获赞数:1448
分布式计算技术核心工程师

向TA提问 私信TA
展开全部
和线程执行的顺序有关。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式