Synchronized

目录

Synchronized的表现形式

普通同步方法

静态同步方法

同步方法块

Java对象头

锁的原理

锁的升级 

偏向锁

轻量级锁

重量级锁

锁的对比


Synchronized的表现形式

普通同步方法

  • 普通同步方法使用 synchronized 关键字修饰,锁对象是当前实例对象(即方法所属对象的实例)。
public synchronized void method() {
    // 锁对象是当前实例对象
}

静态同步方法

  • 静态同步方法使用 synchronized 关键字修饰,锁对象是当前类的 Class 对象。
public static synchronized void staticMethod() {
    // 锁对象是当前类的 Class 对象
}

同步方法块

  • 同步方法块可以指定任意对象作为锁对象。
public void method() {
    synchronized (lockObject) {
        // 锁对象是 synchronized 括号里配置的对象 lockObject
    }
}

Java对象头

锁的原理

JVM 基于 入和退出 Monitor 对象来实现 方法同步和代 码块 同步,但两者的 实现细节 不一 。代 码块 同步是使用 monitorenter和monitorexit 指令 实现 的,而方法同步是使用另外一种方式 实现 的, 细节 JVM 范里并没有详细说明。但是,方法的同步同 可以使用 两个指令来 实现
monitorenter指令是在 编译 后插入到同步代 码块 的开始位置,而 monitorexit 是插入到方法
和异常 JVM 要保 每个 monitorenter 对应 monitorexit 与之配 。任何 象都有
一个 monitor 与之关 ,当且一个 monitor 被持有后,它将 定状 线 行到 monitorenter
指令 ,将会 尝试获 象所 对应 monitor 的所有 ,即 尝试获 象的
总结来讲就是两点
  • 标记锁的开始和结束
  • 在对象头中做标记

锁的升级 

偏向锁

当前线程加锁,先不释放锁,等到有线程来请求锁,并且当前线程已经执行完毕,才会释放锁。

轻量级锁

当锁被其他线程持有,该线程会一直通过自旋的方式来竞争锁。

重量级锁

当轻量级锁解锁时,存在锁的竞争,则会升级成为重量级锁,竞争失败的线程会进入堵塞队列。

锁的对比

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值