java-并发-锁-Synchronized

底层原理:

Synchronized底层是通过monitorenter 和 monitorexit来实现的。

如果synchronize在方法上,那就没有上面两个指令,取而代之的是有一个ACC_SYNCHRONIZED修饰,表示方法加锁了。它会在常量池中增加这个一个标识符,获取它的monitor,所以本质上是一样的。

 

加锁过程:

    1. 如果monitor的进入数为0,则该线程进入monitor,然后将进入数设置为1,该线程即为monitor的所有者。
    2. 如果线程已经占有该monitor,只是重新进入,则进入monitor的进入数加1.
    3. 如果其他线程已经占用了monitor,则该线程进入阻塞状态,直到monitor的进入数为0,再重新尝试获取monitor的所有权。

 

锁升级:

线程锁的状态:

    1. 无锁:没有对资源进行锁定,所有线程都可以访问。
    2. 偏向锁:当一段代码被一直被同一个线程访问。
    3. 轻量级锁:锁是偏向锁的时候,却被另外的线程所访问。
    4. 重量级锁:有一个线程获取锁之后,其余所有等待获取该锁的线程都会处于阻塞状态。

锁的升级过程:

无锁-->偏向锁:同步代码块第一次被线程执行,并且后续也一直是这个线程在执行

偏向锁-->轻量级锁:一个线程持有当前锁的偏向锁,另一个线程来执行此代码块,获取锁,

轻量级锁-->重量级锁:当前锁为轻量级锁,自旋次数达到一定阈值。

 

基本用法:

修饰非静态方法:对调用该方法的对象加锁。对象锁。

修饰静态方法:是对该类对象加锁。类锁。

类锁和对象锁是两种锁,不会出现互斥的情况。

 

Monitor:

Monitor是线程私有数据,每一个线程都有一个可用 monitor record 列表,同时还有一个全局的可用列表。

每一个被锁住的对象都会和一个monitor关联,同时monitor中有一个Owner字段存放拥有该锁的线程的唯一标识。表示该锁被该线程占用。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值