打字猴:1.700451231e+09
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 ]  [ 下一页 ]