自旋对于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. 算法学习:常用排序方法
  2. windows安装gnvm安装教程,node多版本解决方案
  3. 用DzzOffice管理阿里云OSS
  4. sql server 2008表中计算机,电脑删除SQLsever2008表格数据出现“不能删除”怎么办
  5. 16、React Native实战之TextInput组件
  6. Articles for objccn.io. objc.io的完整、准确、优雅的中文翻译版本 http://objccn.io/
  7. ZAO回应被约谈...
  8. 实现网页页面跳转的几种方法(meta标签、js实现、php实现)
  9. 未来计算机的新技术有哪些,科技改变生活!人类未来的十大高科技生活
  10. 轻量级程序编辑器的选择:EmEditor、Editplus等---Web开发系列之工具篇
  11. office PPT插件
  12. vue中实现生成海报图片html2canvas详细教程
  13. ZeroSSL:又一款免费申请SSL证书的利器
  14. 爬虫实战——绝对通俗易懂,爬取房产数据
  15. java判断时间是否超过24小时_判断两个日期是否超过24小时!
  16. 正大杯市场调查与分析竞赛心得
  17. cocos Draw call的理解
  18. 打造泛音乐生态圈 全民K歌要开启中国音乐新世代
  19. 飞凌嵌入式丨NXP MFGTool软件烧录原理
  20. 计算机二级 access应用,计算机二级Access辅导:Access软件应用指南

热门文章

  1. 网站结构优化要做好哪些
  2. 浙大pythonpta作业答案_浙大PTA-Python题库 编程题第一章(1-1~1-3)题解
  3. 行稳致远,进而有为——2020年 XAG发展展望
  4. Ant批量打包工具的使用
  5. linux操作系统. 80188,Materials-Studio5.5在Linux服务器上安装与测算讨论 - 第一原理 - 小木虫 - 学术 科研 互动社区...
  6. Pulling is not possible because you have unmerged files.
  7. java 发卡平台支付_ZFAKA一款免费开源的发卡系统搭建教程 (支持多种支付接口)...
  8. 五一培训 清北学堂 DAY3
  9. 渗透测试的灵魂:信息收集
  10. 轻量应用服务器 饥荒,饥荒服务端世界设置生成