前言
最近在看Java并发编程实战的一书,发现了一个很有意思的问题,以前没有想过的问题:synchronized加在方法上,锁上的对象是什么呢?
正文
public class Lock { //验证synchronized写在普通方法上的锁所住的是类对象 public synchronized void method1(){ try{ System.out.println("invoke in method1()"); Thread.sleep(5000); }catch (InterruptedException e){ } } public void method2(){ Object o = new Object(); System.out.println("invoke in method2()"); synchronized (this){ System.out.println("now invoke in method2():synchronized block"); } } // method3、4验证加载静态方法上的synchronized锁住的是该类的.class对象 public synchronized static void method3(){ try{ System.out.println("invoke in method3()"); Thread.sleep(5000); }catch (InterruptedException e){ } } public static void method4(){ System.out.println("invoke in method4()"); synchronized (Lock.class){ System.out.println("now invoke in method4():synchronized block"); } } public static void main(String[] args){ Lock l = new Lock(); // 注释的两组为同一组实验 // new Thread(()->l.method1()).start(); // new Thread(()->l.method2()).start(); // 未注释的两组为同一组实验 new Thread(()->method3()).start(); new Thread(()->l.method4()).start(); // 验证语法基于JDK8,低于JDK8的版本可写成如下形式 // new Thread(){ // @Override // public void run() { //// 你的代码逻辑,如: // l.method1(); // } // }.start(); } }
有上面的代码可以知道,sychronized加在普通方法上时,锁住的是该类的实例对象;synchronized加在静态方法上时,锁住的是该类的.class对象。