Java并发编程之synchronized

synchronized

原理

Synchronized 是 由 JVM 实 现 的 一 种 实 现 互 斥 同 步 的 一 种 方 式 , 如 果你 查 看 被 Synchronized 修 饰 过 的 程 序 块 编 译 后 的 字 节 码 , 会 发 现 ,被 Synchronized 修 饰 过 的 程 序 块 , 在 编 译 前 后 被 编 译 器 生 成 了monitorenter 和 monitorexit 两 个 字 节 码 指 令 。
当虚拟机遇到monitorenter指令,会尝试去获取对象的锁。若此对象没有被锁定或者该线程已经获得该对象的锁,则将锁的计数器+1。 当 执 行 monitorexit 指 令 时 将 锁 计 数 器 -1。当计数器的值为0时,释放该对象的锁。若获取对象锁失败,则会被一直阻塞,直到该对象锁被另一个线程释放。

Java 中synchronized通过在对象头中设置标记,来实现锁的获取和释放。
Java对象头包括两部分: Mark Word(标记字段)、Klass Pointer(类型指针),而synchronized就是利用Mark Word来达到获取和释放锁的, Mark Word 别设计成一个非固定的数据结构,以实现在极小的空间内尽力存储多的数据,它会根据对象的状态复用自己的存储空间。Mark Word 中包括:hashcode, GC分代年龄,所状态标志线,线程所持用的锁,偏向线程Id,偏向时间戳。

锁的对象

1、明确指定了对象
若synchronized明确指定了对象,如:synchronized(this), synchronized(param)。则说明加锁对象是该对象实例。
在这里插入图片描述
2、未明确指定对象
若synchronized 所修饰的方法是非静态方法,该方法对应的对象(Instance)为锁对象。
在这里插入图片描述
若synchronized所修饰的方法是静态的方法,则该方法对应的类对象(class)为锁对象。
在这里插入图片描述
注意:当一个对象被锁住,该对象中所有用synchronized修饰的方法都将被阻塞,而没用synchronized修饰的方法不受锁的影响,可正常被调用。

特性

1、同步、重量级锁。
2、可重入锁。
3、悲观锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值