synchronized工作过程中,具体讨论下synchronized里面都干了啥??

简介: synchronized工作过程中,具体讨论下synchronized里面都干了啥??

synchronized工作过程中,具体讨论下synchronized里面都干了啥??

  1. 开始是乐观锁,如果锁冲突频繁,就转化为悲观锁
  2. 开始时候轻量级锁实现,如果锁被持有的时间较长,就转换为重量级锁
  3. 实现轻量级锁的时候,大概率用到的自旋锁策略
  4. 是一种不公平锁
  5. 是一种可重入锁
  6. 不是读写锁

synchronized的关键策略:锁升级~

偏向锁:只是先让线程针对锁,做个标记(做个标记很快的,非常轻量)

如果整个代码执行过程中都没有遇到别的线程和竞争这个锁,此时,就不用真的加锁了,但是,一旦要有了别的线程尝试来竞争这个锁!于是偏向锁就立即升级成真正的锁(轻量级锁),此时,别的线程只能等待,既保证了效率,又保证了线程安全!!

锁消除:编辑阶段,做的手段

检测当前代码是否是多线程执行/是否有必要加锁??如果无必要,又把锁给写上了,就会在编译过程中自带把锁去掉!!

如:synchronized不应该被滥用!

StringBuilder与StringBuffer中:StringBuffer是线程安全的!!

对StringBuffer而言,把关键的方法都加了synchronized关键字!!

但是,如果单线程使用StringBuffer,不涉及线程安全问题,但是synchronized是不是也写了??相当于加锁操作,没有真正被编译!!

不是说写了synchronized就一定线程安全

也不是说,不写synchronized就一定线程不安全

这得看具体的代码了!

锁粗化

锁的粒度:synchronized代码块,包含代码的多少(代码越多,粒度越粗,代码越少,粒度越细)

一般写代码的时候,多数情况下,是希望锁的粒度更小一点(串行执行的代码少,并发执行的代码就多),但是,如果某个场景要频繁的加锁/解锁,此时编辑器就可以把这个锁优化成一个更粗粒度的锁!!

每次的加锁/解锁,都要有开锁,尤其是每次释放锁之后,重新加锁,还需要重新竞争。

举列:

上班之后:向领导汇报工作(领导给安排三个工作:ABC)

1.先打电话,汇报工作A的进程,挂了电话;

再打电话,汇报工作B的进程,挂了电话;

再打电话,汇报工作C的进程,挂了电话;

打电话给领导,领导就干不了别的了,别人给领导打电话就得阻塞等待!!

每次锁竞争都可能引起一定的等待开锁,此时整体的效率可能降低!!

2.打一个电话,汇报ABC的工作,挂了电话~~

相关文章
|
9月前
|
缓存 安全 Java
多线程--深入探究多线程的重点,难点以及常考点线程安全问题
多线程--深入探究多线程的重点,难点以及常考点线程安全问题
189 1
|
安全 Java 编译器
Java并发编程学习3-可见性和对象发布
本篇介绍对象的共享之可见性和对象发布
96 2
Java并发编程学习3-可见性和对象发布
|
存储 安全 Java
大白话讲解synchronized锁升级套路
synchronized锁是啥?锁其实就是一个对象,随便哪一个都可以,Java中所有的对象都是锁,换句话说,Java中所有对象都可以成为锁。 这次我们主要聊的是synchronized锁升级的套路
145 0
|
数据采集 缓存 算法
库调多了,都忘了最基础的概念 《锁与线程 2 终结篇》
库调多了,都忘了最基础的概念 《锁与线程 2 终结篇》
153 0
库调多了,都忘了最基础的概念 《锁与线程 2 终结篇》
|
存储 安全 Java
看完你就明白的锁系列之锁的状态
前面两篇文章我介绍了一下 看完你就应该能明白的悲观锁和乐观锁 看完你就明白的锁系列之自旋锁 看完你就会知道,线程如果锁住了某个资源,致使其他线程无法访问的这种锁被称为悲观锁,相反,线程不锁住资源的锁被称为乐观锁,而自旋锁是基于 CAS 机制实现的,CAS又是乐观锁的一种实现,那么对于锁来说,多个线程同步访问某个资源的流程细节是否一样呢?换句话说,在多线程同步访问某个资源时,锁的状态会如何变化呢?本篇文章来探讨一下。
116 0
看完你就明白的锁系列之锁的状态
|
前端开发 Java 程序员
彻底读懂ThreadLocal与Synchronized区别(代码案例详解)
📝本篇用案例代码带初学者彻底读懂ThreadLocal与Synchronized区别!
182 0
彻底读懂ThreadLocal与Synchronized区别(代码案例详解)
J3
|
存储 安全 Java
synchronized解析及锁膨胀过程,面试再也不怕了
synchronized解析及锁膨胀过程,面试再也不怕了
J3
559 0
synchronized解析及锁膨胀过程,面试再也不怕了
|
算法 Java Linux
如果面试官让你分析类初始化阶段的死锁现象
哈喽,我是子牙。十余年技术生涯,一路披荆斩棘从技术小白到技术总监到JVM专家到创业。技术栈如汇编、C语言、C++、Windows内核、Linux内核。特别喜欢研究虚拟机底层实现,对JVM有深入研究。分享的文章偏硬核,很硬的那种。
106 0
如果面试官让你分析类初始化阶段的死锁现象