1700451231
1700451232
}
1700451233
1700451234
System.out.println(“m1执行完毕”);
1700451235
1700451236
}
1700451237
1700451238
public synchronized void m2(){
1700451239
1700451240
System.out.println(“m2执行完毕”);
1700451241
1700451242
}}
1700451243
1700451244
public static void main(String[]args)throws Exception{
1700451245
1700451246
final Foo foo=new Foo();
1700451247
1700451248
//定义一个线程
1700451249
1700451250
Thread t=new Thread(new Runnable(){
1700451251
1700451252
public void run(){
1700451253
1700451254
foo.m1();
1700451255
1700451256
}
1700451257
1700451258
});
1700451259
1700451260
t.start();
1700451261
1700451262
//等待t1线程启动完毕
1700451263
1700451264
Thread.sleep(10);
1700451265
1700451266
//m2方法需要等待m1执行完毕
1700451267
1700451268
foo.m2();
1700451269
1700451270
}
1700451271
1700451272
相信读者明白会先输出“m1执行完毕”,然后再输出“m2执行完毕”,因为m1方法在执行时,线程t持有foo对象的锁,要想主线程获得m2方法的执行权限就必须等待m1方法执行完毕,也就是释放当前锁。明白了这个问题,我们思考一下上例中带有synchronized的递归函数是否能执行?会不会产生死锁?运行结果如下:
1700451273
1700451274
*********9
1700451275
1700451276
********8
1700451277
1700451278
*******7
1700451279
1700451280
******6
[
上一页 ]
[ :1.700451231e+09 ]
[
下一页 ]