synchronized锁及锁升级

一、前言

        synchronized在jdk1.6之前,是通过重量级锁的方式,来实现线程之间的一个锁的竞争的。之所以称它为重量级锁,是因为它的底层依赖操作系统层面的Mutex Lock,来实现互斥锁的一个功能,Mutex是系统方法,由于权限隔离的关系,应用程序调用系统方法的时候,需要切换到内核状态来执行,那这样就涉及到用户态向内核态的一个切换,这个切换会带来一个性能上的损耗。

        在jdk1.6版本之后,synchronized增加了锁的升级这样一个机制来平衡数据安全和性能的一个关系。简单来说,就是线程去访问synchronized同步代码块的时候,synchronized根据线程的竞争情况,先去尝试,在不加重量锁的情况下,去保证线程的安全性。所以呢,引入了偏向锁和轻量级锁这样一个机制。

二、synchronized锁

        通过Synchronized实现同步机制,属于一种悲观锁,在操作数据时,判断该对象是否被锁定,如果被锁定则进入阻塞状态直到被占用的线程释放,如果没有被锁或者当前线程已存在操作对象的锁则进行上锁操作,操作完数据后进行释放操作。

        Synchronized也是一种非公平锁,因为它不会按申请锁的时间来分配锁,而是通过竞争的形式来获取锁,这样提高了执行性能。

        根据synchronized锁修饰的位置不同,可以分成三种锁:

  • 方法锁:synchronized修饰方法时,每个实例对象对应一把锁。
  • 对象锁:synchronized修饰方法或代码块,每个实例对象对应一把锁。
  • 类锁:synchronized修饰静态方法或者静态代码块,所有的实例对象共用同一把锁,我们称之为类锁。

三、锁升级

        从低到高分为:无锁、偏向锁、轻量级锁(自旋锁)、重量级锁。

        偏向锁就是直接把当前的锁偏向于某个线程,简单来说就是通过CAS机制来修改偏向锁的一个标志,这种锁适合在同一个线程,多次去访问申请同一个锁资源的情况,并且没有其他线程去竞争的锁的一个场景中。

        轻量级锁也可以成为自旋锁,它是基于自适应自旋的机制,通过多次自旋去尝试竞争锁。自旋锁的优点在于,它可以避免用户态到内核态切换,所带来的一个性能上的损耗。

线程获取锁的总体流程图

64位的MarkWord标记图

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值