最近看偶然看了别人的面经问到了synchronized的相关问题,想起了以前看过的:synchronized加在方法上,锁住的是类实例,然后还记得有个锁住的是类的.class对象。
但那时候只是看了看,记忆并不深,现在突然看到,便想着自己写一份demo去验证一下,synchronized加载方法上时,究竟锁住了写什么,验证Demo如下:
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对象。