自旋对于synchronized关键字的底层意义与价值分析:

对于synchronized关键字的底层意义和价值分析,下面用纯理论的方式来对它进行阐述,自旋这个概念就会应运而生,还是很重要的,下面阐述下:

JVM中的同步是基于进入与退出监视器对象(Monitor,也叫管程对象)来实现的,每个对象实例都会有一个Monitor对象,Monitor对象会和Java对象一同创建并销毁。Monitor对象是由C++来实现的【未来会通过openjdk来分析C++的底层实现的】。

当多个线程同时访问一段同步代码时,这些线程会被放到一个EntrySet集合中,处于阻塞状态的线程都会被放到该列表当中。接下来,当线程获取到对象的Monitor时,Monitor是依赖于底层操作系统的mutex lock来实现互斥的,线程获取mutex成功,则会持有该mutex,这时其它线程就无法再获取到该mutex。

如果线程调用了wait()方法,那么该线程就会释放掉所持有的mutex,并且该线程会进入到WaitSet集合(等待集合)中,等待下一次被其他线程调用notify/notifyAll唤醒。如果当前线程顺利执行完毕方法,那么它也会释放掉所持有的mutex。

总结一下:同步锁在这种实现方式当中,因为Monitor是依赖于底层的操作系统实现,这样就存在用户态和内核态之间的切换,所以会增加性能开销。

通过对象互斥锁的概念来保证共享数据操作的完整性。每个对象都对应于一个可称为“互斥锁”的标记,这个标记用于保证在任何时刻,只能有一个线程访问该对象。

那些处于EntrySet和WaitSet中的线程均处于阻塞状态,阻塞操作是由操作系统来完成的,在linux下是通过pthread_mutex_lock函数实现的。线程被阻塞后便会进入到内核调度状态,这会导致系统在用户态和内核态之间切换,严重影响锁的性能。

解决上述问题的办法便是自旋【Spin】。其原理是:当发生对Monitor的争用时,若owner能够在很短的时间内释放掉锁,则那些正在争用的线程就可以稍微等待一下(既所谓的自旋),在Owner线程释放锁之后,争用线程可能会立刻获取到锁,从而避免了系统阻塞。不过,当Owner运行的时间超过了临界值后,争用线程自旋一段时间后依然无法获取到锁,这时争用线程则会停止自旋而进入到阻塞状态。所以总体的思想是:先自旋,不成功再进行阻塞,尽量降低阻塞的可能性,这对那些执行时间很短的代码来说有极大的性能提升。显然,自旋在多处理器(多核心)上才有意义 。

互斥锁属性详解与Monitor对象特性解说:

在上面标红的关键词中提到了互斥锁,下面对其相关的属性进行说明一下:

1、PTHREAD_MUTEX_TIMED_NP:这是缺省值,也就是普通锁。当一个线程加锁以后,其余请求锁的线程将会形成一个等待队列,并且在解锁后按照优先级获取到锁。这种策略可以确保资源分本怕公平性。

2、PTHREAD_MUTEX_RECURSIVE_NP:嵌套锁。允许一个线程对同一个锁成功获取多次,并通过unlock解锁【如果调用三次,则需要unlock三次】。如果是不同线程请求,则在加锁线程解锁时重新进行竞争。

3、PTHREAD_MUTEX_ERRORCHECK_NP:检错锁。如果一个线程请求了同一个锁,则返回EDEADLK,否则与PTHREAD_MUTEX_TIMED_NP类型动作相同,这样就保证了当不允许多次加锁时不会出现最简单情况下的死锁。

4、PTHREAD_MUTEX_ADAPTIVE_NP:适应锁。动作最简单的锁类型,仅仅等待解锁后重新竞争。

自旋对于synchronized关键字的底层意义与价值分析:相关推荐

  1. synchronized关键字的底层原理以及JDK1.6之后的底层优化

    synchronized关键字底层原理属于JVM层面. 1. synchronized关键字修饰同步代码块,synchronized同步代码块的实现使用的是monitorenter和monitorex ...

  2. synchronized 关键字的底层原理

    synchronized关键字实现了多个线程之间访问资源的同步性,保证了被它修饰的方法或代码块在任意时刻最多只有一个线程执行. synchronized关键字是通过JVM底层实现的. 按使用位置分,同 ...

  3. synchronized关键字实现同步

    synchronized关键字的使用 Java语言提供了synchronized关键字,可以给方法或代码块进行加锁,从而实现同步. synchronized关键字取的锁都是对象锁,而不是把代码块或方法 ...

  4. synchronized()_这篇文章带你彻底理解synchronized关键字

    Synchronized关键字一直是工作和面试中的重点.这篇文章准备彻彻底底的从基础使用到原理缺陷等各个方面来一个分析,这篇文章由于篇幅比较长,但是如果你有时间和耐心,相信会有一个比较大的收获,所以, ...

  5. synchronized原理_面试必备—Synchronized 关键字使用、底层原理

    在并发编程中存在线程安全问题,主要原因有: 1.存在共享数据 2.多线程共同操作共享数据 关键字synchronized可以保证在同一时刻,只有一个线程可以执行某个方法或某个代码块,同时synchro ...

  6. 多线程高并发 底层锁机制与优化的最佳实践——各种锁的分类 || synchronized 关键字 倒底锁的是什么东西?|| CAS与ABA问题||锁优化||轻量级锁一定比重量级锁的性能高吗

    多线程高并发 底层锁机制与优化的最佳实践 各种锁的分类 加上synchronized 关键字,共享资源就不会出错 synchronized 关键字 倒底锁的是什么东西? synchronized 锁的 ...

  7. java实现关键词云_Java synchronized 关键字的实现原理

    数据同步需要依赖锁,那锁的同步又依赖谁?synchronized给出的答案是在软件层面依赖JVM,而Lock给出的方案是在硬件层面依赖特殊的CPU指令,大家可能会进一步追问:JVM底层又是如何实现sy ...

  8. Java并发深度总结:synchronized 关键字

    志之所趋,无远勿届,穷山距海,不能限也. 内容 1. 线程安全 2. 互斥同步 3. synchronized 特性 4. synchronized 基础 4.1 synchronized 代码块 4 ...

  9. synchronized 关键字详解

    synchronized关键字详解 文章目录 synchronized关键字详解 一.synchronized简介(是什么) 用户态和内核态: 二.synchronized应用(怎么用) 修饰实例方法 ...

最新文章

  1. html2canvas图片截图截不到图像的问题解决
  2. Java 利用接口实现回调
  3. Java中如何执行source命令,在Java中运行UNIX Source命令
  4. Java面试之ArrayList为什么线程不安全?
  5. 电商促销海报BANNER设计要点,万能套用PSD分层模板,先收好!
  6. win11网络配置文件类型怎么更改 Windows11更改网络配置文件类型的步骤教程
  7. matlab转换为exe文件,MATLAB文件转为exe可执行文件(package使用)
  8. POJ 1026 Cipher
  9. Xcode9 LaunchScreen.storyboard 设置app启动图片
  10. 《BDD100K: A Diverse Driving Dataset for Heterogeneous Multitask Learning》论文阅读笔记
  11. linux 检测screen,linux screen编程,自动监控并向screen发送命令
  12. http请求 405错误 方法不被允许 (Method not allowed)
  13. EverEdit逆向 PE结构
  14. 关闭bitLocker驱动器加密
  15. MATLAB---制作动画并演示
  16. 企业跨境电商平台服务解决方案,跨境电子商务贸易业务框架搭建运维
  17. 揭秘霸王龙如何捕食三角龙:先斩首后享用(图)
  18. 国行Surface Laptop 3评测:微软最佳轻薄本之作
  19. 公交线路图查询系统c语言,c语言公交最优路径查询数据结构(附设计报告_完整代码).doc...
  20. python外星人入侵小游戏

热门文章

  1. RK3288-人脸识别主板方案
  2. 计算机操作员考评标准,计算机操作员职业技能鉴定标准高级.doc
  3. K近邻算法(k-nearest neighbor,KNN)
  4. Unity 绘制弹球和台球的运动轨迹
  5. 设计模式(二)(C++)
  6. 校园网、CMCC自动登录
  7. 2021年江西省上饶市高考成绩查询,2021年上饶高考状元名单公布,上饶文理科状元是谁多少分...
  8. xmanager 5 破解版,有需要自己下载
  9. python矩阵乘法 点乘_Tensorflow矩阵运算实例(矩阵相乘,点乘,行/列累加)
  10. pressOn在线制作流程图、思维导图、架构图等