其实就是考察 synchronized 锁住的是哪个对象  
 情况1:12 或 21  
@Slf4j(topic = "c.Number") class Number{     public synchronized void a() {         log.debug("1");     }     public synchronized void b() {         log.debug("2");     } }
 
  public static void main(String[] args) {     Number n1 = new Number();     new Thread(()->{ n1.a(); }).start();     new Thread(()->{ n1.b(); }).start(); }
   | 
 
 情况2:1s后12,或 2 1s后 1  
@Slf4j(topic = "c.Number") class Number{     public synchronized void a() {         sleep(1);         log.debug("1");     }     public synchronized void b() {         log.debug("2");     } } public static void main(String[] args) {     Number n1 = new Number();     new Thread(()->{ n1.a(); }).start();     new Thread(()->{ n1.b(); }).start(); }
   | 
 
 情况3:3 1s 12 或 23 1s 1 或 32 1s 1  
@Slf4j(topic = "c.Number") class Number{     public synchronized void a() {         sleep(1);         log.debug("1");     }     public synchronized void b() {         log.debug("2");     }     public void c() {         log.debug("3");     } } public static void main(String[] args) {     Number n1 = new Number();     new Thread(()->{ n1.a(); }).start();     new Thread(()->{ n1.b(); }).start();     new Thread(()->{ n1.c(); }).start(); }
   | 
 
 情况4:2 1s 后 1  (因为锁的不是一个对象)
@Slf4j(topic = "c.Number") class Number{     public synchronized void a() {         sleep(1);         log.debug("1");     }     public synchronized void b() {         log.debug("2");     } } public static void main(String[] args) {     Number n1 = new Number();     Number n2 = new Number();     new Thread(()->{ n1.a(); }).start();     new Thread(()->{ n2.b(); }).start(); }
   | 
 
 情况5:2 1s 后 1  (锁住的不是一个对象,一个是类对象,一个是普通对象)
@Slf4j(topic = "c.Number") class Number{     public static synchronized void a() {         sleep(1);         log.debug("1");     }     public synchronized void b() {         log.debug("2");     } } public static void main(String[] args) {     Number n1 = new Number();     new Thread(()->{ n1.a(); }).start();     new Thread(()->{ n1.b(); }).start(); }
   | 
 
 情况6:1s 后12, 或 2 1s后 1  
@Slf4j(topic = "c.Number") class Number{     public static synchronized void a() {         sleep(1);         log.debug("1");     }     public static synchronized void b() {         log.debug("2");     } } public static void main(String[] args) {     Number n1 = new Number();     new Thread(()->{ n1.a(); }).start();     new Thread(()->{ n1.b(); }).start(); }
   | 
 
 情况7:2 1s 后 1  
@Slf4j(topic = "c.Number") class Number{     public static synchronized void a() {         sleep(1);         log.debug("1");     }     public synchronized void b() {         log.debug("2");     } } public static void main(String[] args) {     Number n1 = new Number();     Number n2 = new Number();     new Thread(()->{ n1.a(); }).start();     new Thread(()->{ n2.b(); }).start(); }
   | 
 
 情况8:1s 后12, 或 2 1s后 1  
@Slf4j(topic = "c.Number") class Number{     public static synchronized void a() {         sleep(1);         log.debug("1");     }     public static synchronized void b() {         log.debug("2");     } } public static void main(String[] args) {     Number n1 = new Number();     Number n2 = new Number();     new Thread(()->{ n1.a(); }).start();     new Thread(()->{ n2.b(); }).start(); }
   |