Synchronized底层原理(简易版)

77 阅读1分钟

简介

synchronized关键字是解决多线程之间访问资源的同步性,也叫同步锁(悲观锁思想)

废话不多说,直接上例子!!

例子

  • synchronized放在方法体内部

源代码:

public void fun1(){
    synchronized (this){
        System.out.println("fun111111111111111111111111");
    }
}

经过编译和反编译之后结果如下(显示获取、释放锁): https://cdn.nlark.com/yuque/0/2024/png/28605255/1709171170987-82313c1b-15eb-4c87-b483-da7bf547a8cc.png#averageHue=%231b1515&clientId=u3201ecbe-3a9b-4&from=paste&height=347&id=ua74d6c4d&originHeight=347&originWidth=302&originalType=binary&ratio=1&rotation=0&showTitle=false&size=11519&status=done&style=none&taskId=u90ccf12e-861a-4c56-b146-6ff416cefd9&title=&width=302 monitorenter:代表监视器入口,获取锁 monitorexit:代表监视器出口,释放锁 monitorexit:第二次monitorexit代表发生异常,释放锁

  • synchronized放在方法名上
public synchronized static void fun2(){
    System.out.println("fun222222222222222222222222222222");
}

public synchronized void fun3(){
    System.out.println("fun3333333333333333333333333333333");
}

经过编译和反编译之后结果如下: https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/c6a9d53d30fb498a98f845980ce494ac~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=859&h=422&s=30723&e=png&b=0c0c0c 当synchronized在方法名上时,会进行 flag 同步标识(隐式获取、释放锁)

  • 编译命令:javac 文件名称.java
  • 反编译命令:javap -verbose 文件名称.class

希望对您有帮助!