1、
/一个同步方法调用另外一个同步方法,能否得到锁? //重入 synchronized默认支持重入 @Slf4j(topic = "test") public class Demo { synchronized void test1(){ log.debug("test1 start........."); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } test2(); } /** * 为什么test2还需要加sync * * 他本身就包含在test1 而test1已经加了sync */ synchronized void test2(){ try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } log.debug("test2 start......."); } public static void main(String[] args) { Demo demo= new Demo(); demo.test1(); } }
执行结果
17:20:57.866 [main] DEBUG test - test1 start.........
17:21:00.872 [main] DEBUG test - test2 start.......
2、
/这里是重入锁的另外一种情况,继承 @Slf4j(topic = "test") public class Demo { synchronized void test(){ log.debug("demo test start........"); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } log.debug("demo test end........"); } public static void main(String[] args) { new Demo2().test(); } } @Slf4j(topic = "test") class Demo2 extends Demo { @Override synchronized void test(){ log.debug("demo2 test start........"); super.test(); log.debug("demo2 test end........"); } }
执行结果
17:21:39.129 [main] DEBUG test - demo2 test start........
17:21:39.135 [main] DEBUG test - demo test start........
17:21:40.137 [main] DEBUG test - demo test end........
17:21:40.137 [main] DEBUG test - demo2 test end........