【Java锁】synchronized锁原理

最近在看《实战Java高并发程序设计》,看到synchronized锁,故整理下synchronized锁的锁原理及源码分析,若有错及建议,请指正。

一、synchronized 的用法

(1)修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁
(2)修饰静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁
(3)修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁

二、实现原理

synchronized可以保证变量的原子性,可见性和顺序性,所以可以保证方法或者代码块在运行时只有一个方法可以进入临界区获取资源,同时还可以保证内存变量的内存可见性。并且synchronized是一个可重入锁 。
(1)字节码层面 
synchronized是基于进入和退出管程(Monitor)对象实现(monitorenter和monitorexit), monitorenter指令插入到同步代码块的开始位置,monitorexit指令插入到同步代码块结束的位置,任何一个对象都有一个Monitor与之相关联,当一个线程持有Minitor后,它将处于锁定状态。 

(2)JVM层面实现 
在JVM级别是通过编译后access_flags标志位(ACC_SYNCHRONIZED)来表示是否使用了synchronized。

(三)synchronized的优化 
synchronized在JDK1.6之前是重量级锁,在JDK1.6以后对synchronized做了优化,增加了偏向锁,轻量级锁,锁粗化,锁消除,适应性自旋等操作,大大增加了synchronized的效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值