深入理解java虚拟机--线程安全与锁优化

深入理解java虚拟机--线程安全与锁优化

    • 面向过程编程思想和面向对象编程思想
    • java语言中的线程安全
    • 线程安全的实现方法
    • 锁优化

面向过程编程思想和面向对象编程思想

面向过程编程思想:站在计算机的角度,以算法为核心,数据是客体,程序代码处理数据。
面向对象编程思想:站在现实世界的角度,数据和行为视为对象的一部分。

java语言中的线程安全

5类共享数据类别:1.不可变;2.绝对线程安全;3.相对线程安全;4.线程兼容;5.线程对立。

  1. 不可变(final)
    不可变带来的安全性是最简单和最纯粹的。基本数据类型,final关键字修饰;共享数据是一个对象,对象的行为用final修饰。
  2. 绝对线程安全
    定义:当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的。
  3. 相对线程安全
    单独操作是线程安全的;需要额外的同步手段(特定顺序的连续调用)。
    例子:Vector的get()、remove()、size()等方法;其他类如:HashTable等。
  4. 线程兼容
    本身不是线程安全的;需要正确使用同步手段。
    例子:Vector的get()、remove()、size()等方法;其他类如:ArrayList、HashMap等。
  5. 线程对立
    无论是采取何种同步措施,都无法达到线程安全的。
    例子:Thread类的suspend()和resume();其他类如:System类的setInt()、setOut()和runFinalizersOnExit()等。

线程安全的实现方法

3种实现方法:1.互斥同步;2.非阻塞同步;3.无同步方案。

  1. 互斥同步
    也称阻塞同步;互斥是方法,同步是目的;互斥的实现方式主要有三种:临界区,互斥量,信号量。实现同步手段:synchronized和ReentrantLock。
  • synchronized:原生语法层面的互斥;关键字经过编译后在同步块前后形成monitorenter和monitorexit两个字节码指令,这两字字节码指令都需要一个reference类型的参数来指明要锁定和解锁的对象;如果synchronized修饰的实例方法则去取对应的对象实例,如果修饰的是类方法,则去取Class对象所为锁对象。有两点要注意的:1.synchronized同步块对同一条线程来说是可重入的,不会出现自己把自己锁死的情况;2.同步块在已进入的线程执行完之前,会阻塞后面其他线程的进入。

  • ReentrantLock:API层面的互斥;相对于synchronized来说有三个高级特性:1.等待可中断;2.可实现公平锁;3.锁可以绑定多个条件;

  • synchronized和ReentrantLock吞吐量比较
    jdk1.5版本:ReentrantLock>synchronized;
    jdk1.6后版本:synchronized、ReentrantLock两者持平;

  • 处理问题方式角度:互斥同步是悲观策略。

    阻塞和唤醒一个线程,需要从用户态转换到核心态,消耗性能。

  1. 非阻塞同步
  • 定义

    基于冲突检测的乐观并发策略,先进行操作,如果没有其他线程的竞争共享数据,那操作就是成功了;如果共享数据有争用,产生了冲突,那就再采取其他的补充措施(最常见的补偿措施就是不断的重试,直到成功为止),这种乐观的策略很多实现都不需要把线程挂起。

  • 处理问题方式角度:非阻塞同步是乐观策略。

  • CAS指令
    内存位置(V)、旧的预期值(A)、新值(B);
    CAS指令执行时,当且仅当V符合旧预期值A时,处理器用新值B更新V的值,否则它就不执行更新,但是无论是否更新了V的值,都会返回V的旧值,上述的处理过程是一个原子操作。

    CAS漏铜,ABA问题:
    如果一个变量V初次读取的时候是A值,并且在准备赋值的时候检查到它仍然是A值,那我们就能说它的值没有被其他线程改变过了吗?如果在这段期间它的值曾经被改成了B,后来又被改成了A,那CAS操作就会误认为它从来没有被改变过。

  1. 无同步方案

    2类:1.可重入代码;2.线程本地存储。

    1. 可重入代码
      3个特征:不依赖存储在堆上的数据和公用的系统资源、用到的状态量都是由参数传入、不调用非可重入的方法。

    2. 线程本地存储
      例子:生产者-消费者:Web交互模型中的"一个请求对应一个服务器线程"的处理方式。

锁优化

5种锁优化:1.自旋锁和自适应自旋;2.锁消除;3.锁粗化;4.轻量级锁;5.偏向锁。

  1. 自旋锁和自适应自旋
  • 自旋锁定义
    是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁。
  • 自适应自旋定义
    • 自旋的时间不在固定,由前一次在同一个锁上的自旋时间及锁的拥有者的状态决定。
  • 原因
    • 挂起线程和唤醒线程会消耗处理器时间
    • 共享数据的锁定状态很多情况只会持续很短的时间
  1. 锁消除
  • 定义
    指在虚拟机即时编译器在运行时,对一些代码上要求同步,但是被检测到不可能存在共享数据竞争的锁进行消除。
  1. 锁粗化
    范围扩大,如果虚拟机探测到有这样的一串零碎的操作都是对同一个对象加锁,将会把加锁同步的范围扩展(粗化)到整个操作序列的外部,这样只需要加锁一次就可以了。

  2. 轻量级锁

  • 没有多线程的竞争前提下;减少传统的重量级所使用操作系统互斥量产生的性能消耗。
  • Mark Word
  1. 偏向锁
  • 消除数据在无竞争情况下的同步原语,进一步提高程序的运行性能。
  • 不用做CAS操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/413614.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

配置mysql环境变量

配置mysql环境变量(非必要) 说明:给mysql配置环境变量后我们就可以在cmd里运行mysql(开启、停止等操作) 1. 和其实环境变量的配置方法一样,我们打开环境变量配置窗口(组合键winPause -> 更改…

工作325:uni-格式化日期

/*格式化日期&#xff1a;yyyy-MM-dd*/formatDate(date) {var myyear date.getFullYear();var mymonth date.getMonth() 1;var myweekday date.getDate();if (mymonth < 10) {mymonth "0" mymonth;}if (myweekday < 10) {myweekday "0" mywe…

微信小程序获取unionid为空

微信小程序获取unionid为空原因&#xff1a;未绑定微信开放平台绑定步骤原因&#xff1a;未绑定微信开放平台 最新在调试一个新的微信小程序&#xff0c;因为要对web授权登录、app授权登录、小程序授权登录&#xff1b;几种登录场景根据unionid来开放登录。但是授权出现获取un…

《精通Python设计模式》学习之原型模式

暂时在工作中&#xff0c;还没有用到呢~~~ 以后要留意一下&#xff0c;主要用于复制对象副本&#xff0c; 然后又有自定义属性的地方。 import copy from collections import OrderedDictclass Book:def __init__(self, name, authors, price, **rest):self.name nameself.aut…

alipay.data.bill.balance.query ISV权限不足

alipay.data.bill.balance.query ISV权限不足alipay.data.bill.balance.query是支付宝商家账户当前余额查询接口&#xff1b;目前调用该接口返回 ISV权限不足 完整返回&#xff1a; {"body":"{"alipay_data_bill_balance_query_response":{"cod…

[css] 你有用过animation-fill-mode属性吗?它有什么应用场景

[css] 你有用过animation-fill-mode属性吗&#xff1f;它有什么应用场景 动画播放完成之后的动作&#xff0c;比如可以定义动画播放完成之后回到初始状态个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨…

[css] 用css实现一个等腰三角形的小图标

[css] 用css实现一个等腰三角形的小图标 <style>.box{width: 0;height: 0;margin: 100px auto;border-width: 0px 200px 200px 200px;border-style: solid;border-color: transparent transparent red transparent;}</style>个人简介 我是歌谣&#xff0c;欢迎和大…

shell语法 06-Linux文本处理-grep

grep命令在一个或多个文件中查找某个字符模式。如果这个模式中包含空格&#xff0c;就必须用引号把它括起来。grep Tom /etc/passwd grep 将在文件中查找/etc/passwd 中查找模式 Tom。结果如下&#xff1a; 查找成功&#xff0c;文件中相应行会显在屏幕上没有找到指定的模式&am…

[css] 使用css实现蒙版的效果

[css] 使用css实现蒙版的效果 filter: blur(1px)个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

redis启动警告解决

背景 最近在测试环境重启后,redis启动遇到了三个警告 第一个警告&#xff1a;The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. 第二个警告&#xff1a;overcommit_memory is set to 0! Background…

[css] 父元素下有子元素,子元素也有高度但父元素的高度为何为0呢?分析下可能出现的原因及解决方法

[css] 父元素下有子元素&#xff0c;子元素也有高度但父元素的高度为何为0呢&#xff1f;分析下可能出现的原因及解决方法 父元素塌陷父元素在文档流中高度默认是被子元素撑开的&#xff0c;当子元素脱离文档流以后&#xff0c;将无法撑起父元素的高度&#xff0c;也就会导致父…

[css] 假如css的分号写在声明块之外,将会发生什么呢?解释下原因

[css] 假如css的分号写在声明块之外&#xff0c;将会发生什么呢&#xff1f;解释下原因 这样写第一条规则的分号会被放到第二条规则的句首解析&#xff0c;导致第二条解析报错&#xff0c;从而略过。<style> p {color: blue} ;.p1 {color: red} .p2 {color: green} <…

树莓派安装vnc server并设置自启动

在SSH终端输入sudo raspi-config, 这里需要打开几个选项: expand_rootfs – 将根分区扩展到整张SD卡;change_pass – 默认的用户名是pi&#xff0c;密码是raspberry;change_timezone – 更改时区, 选择Asia – Shanghai;configure_keyboard, 选English&#xff08;US&#xff0…

[css] 如何阻止:hover、:active等鼠标行为状态的触发?

[css] 如何阻止:hover、:active等鼠标行为状态的触发&#xff1f; css属性&#xff1a;pointer-events: none;应用 避免重复提交---按钮点击后 即增加该属性 使其不 链接不可跳转---指定a标签加上该属性 点击被上方元素覆盖的下方链接---上方元素添加该属性个人简介 我是歌谣…

常用的HTML标签(超文本标记语言)

HTMl (Hyper Text Markup Language)基本标签基本结构标签<!--..-->注释标志,在"<!--"与"-->"之间的内容将不在浏览器中显示(指定了HTML文档遵循的文档类型定义)<html>表示该文件为html文件<head></head>包含文件的标题,使用…

[css] 用css画一个平行四边形

[css] 用css画一个平行四边形 .parallelogram {margin: 30px;width: 200px;height: 100px;border: 1px solid slateblue;transform: skew(-20deg); } <div class"parallelogram"></div>个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放…

洛谷 P1063 能量项链 区间dp

洛谷 P1063 题意&#xff1a;在一串项链中&#xff0c;是环状的&#xff0c;第 i 颗珠子有两个能量a[i]和a[i1],第i1颗珠子有两个能量a[i1]和a[i2],可以合并两个珠子&#xff0c;得到a[i]*a[i1]*a[i2]的能量&#xff0c;这两个珠子合并成a[i]和a[i2]的新珠子&#xff0c;问通过…

支付宝第三方授权登陆

支付宝微信第三方软件的接入&#xff0c;也是越来越流行&#xff0c;最近也稍微研究了一下&#xff0c;支付宝和微信的登陆接入。 由于本人是做Java后台发开的&#xff0c;所以前端app集成没有涉及&#xff0c;研究的是网页和后台部分。 做第三方软件的​接入&#xff0c;…

[css] H5如何禁止显示系统菜单?

[css] H5如何禁止显示系统菜单&#xff1f; touch-callout:none; user-select:none;个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

[css] 如何让表格单元格等宽显示

[css] 如何让表格单元格等宽显示 table-layout: fixed; width: 100%;个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题