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
有时候跟第一次执行结果一样,为什么呢? 展开
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
有时候跟第一次执行结果一样,为什么呢? 展开
2个回答
展开全部
问题一: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的时间差异,输出结果的变化也在情理之中了。
问题二:这样的执行结果就是有时候:
main.b=2000
m1.b=101
有时候跟第一次执行结果一样,为什么呢?
答:你这里的同步设定没有意义,例如m1加了synchronized ,当m1被调用并未执行完时,其他线程不能调用执行该方法,但这与m2无关,同样,当m2执行时,也与m1无关,这样由于sleep的时间差异,输出结果的变化也在情理之中了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询