标签:name 描述 new 答案 star 代码 括号 int() 同步锁
本文不会特别深入细致地讨论synchronized,只是做一个通俗易懂的说明,以及看清一类问题的本质,希望能给大家一点启发。
问题描述
有一个类A,提供了三个方法。分别是静态同步方法,非静态同步方法,含有静态代码块的方法
1 class A{ 2 public static synchronized void print1(){ 3 print(); 4 } 5 public synchronized void print2(){ 6 print(); 7 } 8 public void print3(){ 9 synchronized (new Object()){ 10 print(); 11 } 12 } 13 private static void print(){ 14 while(true){ 15 String threadName = Thread.currentThread().getName(); 16 System.out.println(threadName); 17 } 18 } 19 }
请回答一下四种情况的输出结果
1 class Test { 2 // 1.两个线程,同一个类,调用静态同步方法print1 3 @Test 4 public void test1() { 5 Thread thread1 = new Thread(() -> A.print1()); 6 Thread thread2 = new Thread(() -> A.print1()); 7 thread1.start(); 8 thread2.start(); 9 } 10 // 2.两个线程,同一个对象,调用非静态同步方法print2 11 @Test 12 public void test2() { 13 A a = new A(); 14 Thread thread1 = new Thread(() -> a.print2()); 15 Thread thread2 = new Thread(() -> a.print2()); 16 thread1.start(); 17 thread2.start(); 18 } 19 // 3.两个线程,不同对象,调用非静态同步方法print2 20 @Test 21 public void test3() { 22 Thread thread1 = new Thread(() -> new A().print2()); 23 Thread thread2 = new Thread(() -> new A().print2()); 24 thread1.start(); 25 thread2.start(); 26 } 27 // 4.两个线程,同一个对象,调用普通非静态方法(带有同步代码块)print3 28 @Test 29 public void test4() { 30 A a = new A(); 31 Thread thread1 = new Thread(() -> a.print3()); 32 Thread thread2 = new Thread(() -> a.print3()); 33 thread1.start(); 34 thread2.start(); 35 } 36 }
问题答案
先直接报上答案:
问题本质分析
不废话,直接点出,这四个问题只要明白两件事即可:
所以
所以
Game Over
标签:name 描述 new 答案 star 代码 括号 int() 同步锁
原文地址:http://www.cnblogs.com/flashsun/p/7270139.html