JUC之Synchronized

悲观锁
认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。
synchronized关键字和Lock的实现都是悲观锁
适合写操作多的场景,先加锁可以保证写操作时数据正确,显式的锁定之后再操作同步资源。
乐观锁
认为自己在使用数据时,不会有别的线程来修改数据或资源,所以不会加锁。在Java中是通过使用无锁编程来实现,只是在更新数据的时候去判断,之前有没有别的线程更新了这个数据。如果这个数据没有被更新,当前线程将自己修改的数据成功写入。如果这个数据已经被其他线程更新,则根据不同的实现方式执行不同的操作,比如1放弃修改、重试抢锁等等。
判断规则:
1 版本号机制Version 2.最常采用的是CAS算法,Java原子类中的递增操作就通过CAS自旋实现。
适合读操作多的场景,不加锁的特点能够使其读操作的性能大幅度的提升。

Synchronized
八锁原理总结
一个对象里面如果有多个synchronized方法,某一个时刻内,只要一个线程去调用其中的一个synchronized方法了,其他的线程都只能等待。换句话说,某一个时刻内,只能有唯一的一个线程去访问synchronized方法,锁的是当前对象this,被锁定后,其他的线程都不能进入到当前对象其他的synchronized方法。
加个普通方法后,发现与同步锁无关。换成两个对象后,不是同一把锁了。
对于普通同步方法,锁的是当前实例对象,通常指this,所有的普通同步方法用的都是同一把锁,实例对象本身。
对于静态同步方法,锁的是当前类的Class对象,如Phone.class唯一的一个模板。
对于同步方法块,锁的是synchronized括号内的对象。
具体实例对象this和唯一模板class,这两把锁是两个不同的对象,所以静态同步方法与普通同步方法之间是不会有竞态条件的,但是一旦一个静态同步方法获取锁后,其他的静态同步方法都必须等待该方法释放锁后才能获取锁。
在这里插入图片描述
每一个.Class模板位于方法区,每一个new出来的实例位于堆中。

synchronized字节码解析
实现使用的是monitorenter和monitorexit指令
。一般情况下,1个enter对应两个exit
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
synchronized普通同步方法
在这里插入图片描述
为什么任何一个对象都可以是一把锁?
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

Synchronized与锁升级
在这里插入图片描述
锁升级的过程
在这里插入图片描述
java5之前,只有synchronized,这个是操作系统级别的重量级的操作。重量级锁,假如锁的竞争比较激烈的话,性能下降。Java5之前,用户态和内核态之间的切换。
在这里插入图片描述
为什么每一个对象可以是一把锁?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Java6之后,为了减少获得锁和释放锁锁带来的性能消耗,引入了轻量级锁和偏向锁。(需要有个逐步升级的过程,不能一开始就到重量级锁)
synchronized用的锁是存在Java对象头里的Mark Word中,锁升级功能主要依赖MarkWord中锁标志位和释放偏向锁标志位。
锁指向
无锁
在这里插入图片描述在这里插入图片描述

在这里插入图片描述

偏向锁
偏向锁:单线程竞争。当线程A第一次竞争到锁时,通过操作修改Mark Word中的偏向线程ID、偏向模式。如果不存在其他线程竞争,那么持有偏向锁的线程将永远不需要进行同步
当一段同步代码一直被同一个线程多次访问,由于只有一个线程,那么该线程在后续访问时便会自动获得锁。
多线程的情况下,锁不仅不存在多线程竞争,还存在锁由同一个线程多次获得的情况,偏向锁就是在这种情况下出现的,他的出现是为了解决只有在一个线程执行同步时提高性能
在这里插入图片描述
在这里插入图片描述
偏向锁的持有(理论)
在这里插入图片描述
技术实现
在这里插入图片描述
在这里插入图片描述
JVM 不用和操作系统协商设置Mutex(争取内核),它只需要记录下线程ID就标示自己获得了当前锁,不用操作系统接入。在没有其他线程竞争的时候,一直偏向于当前线程,当前线程可以一直执行。
偏向锁设置的相关参数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
偏向锁的撤销
在这里插入图片描述
在这里插入图片描述
JDK15 废弃了偏向锁
在这里插入图片描述
轻量级锁
轻量级锁:多线程竞争,但是任意时刻最多只有一个线程竞争,即不存在锁竞争太激烈的情况,也就没有线程阻塞。本质就是自旋锁CAS

在这里插入图片描述
在这里插入图片描述
轻量级锁的加锁
在这里插入图片描述
在这里插入图片描述
轻量级锁的演示
在这里插入图片描述
自适应自旋锁的大致原理
在这里插入图片描述
轻量级锁与偏向锁的区别和不同
轻量级锁只有一个线程获取锁
在这里插入图片描述
重锁
重量级锁的原理
在这里插入图片描述
代码演示
在这里插入图片描述
锁升级后,hashcode去哪里了??
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
锁消除

  • 48
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值