Java多线程基础知识-2

线程的3个方法:

Thread.sleep():当前线程睡眠多少毫秒,让给其他线程去执行。

Thread.yield():当前线程退出一下,进入到等待队列,让其他线程执行,即让出线程一下。

Thread.join():等待另外一个线程的结束。

synchronized关键字:

  • 对象锁:对某个对象加锁,而不是代码
    • 锁对象不能是String常量(容易跟类库中锁对象重复)、Integer(值变会创建新的对象)、Long
  • 可重入锁:

见com.hanxiaozhang.threadbase1ndedition.synchronizedkeyword.No5SynchReentrant

  • 锁异常自动释放:

见com.hanxiaozhang.threadbase1ndedition.synchronizedkeyword.No6SynchExceptionRelease

  • synchronized是排队运行,即按顺序运行:

见com.hanxiaozhang.threadbase1ndedition.synchronizedkeyword.No3SynchLineUp

  • synchronized使用是"对象监视器"
  • 语法:
    • synchronized同步方法
    • synchronized同步代码块
      • synchronized(this) synchronized void m()
      • synchronized(非this对象 x)
        • 在多个线程持有"对象监视器"为同一个对象的前提下,同一个时间只有一个线程可以执行synchronized(非this对象 x)同步代码块中的代码
        • synchronized(非this对象 x)与持有不同的对象监视器方法或代码块是异步的
  • synchronized static void m() 这里相当于 synchronized(T.class)
    • Class类锁与对象锁之间的异步
    • Class类可以对类所有对象实例起作用

锁定某个对象o,如果o的属性发生变化,不影响锁的使用,但是如果o变成另一个对象,则锁定的对象发生改变,应该避免锁定对象的引用变成另外的对象。--> 解决:加final

synchronized底层实现:

前提:基于HotSpot实现的JVM。

synchronized发展:

  • 早期使用重量级的系统锁
  • JDK1.6以后使用锁升级

锁的四种状态:

无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态。

锁的优化:

适应性自旋锁、锁消除、偏向锁、锁粗化、偏向锁

Mark Word:

32位:

偏向锁:
  • 偏向锁是在单线程执行代码块时使用的机制,如果在多线程并发的环境下(即线程A尚未执行完同步代码块,线程B发起了申请锁的申请),则一定会转化为轻量级锁或者重量级锁。
轻量级锁(自旋锁):
  • 轻量级锁是为了在线程交替执行同步块时提高性能,而偏向锁则是在只有一个线程执行同步块时进一步提高性能。
  • 修改MarkWord(修改锁状态),拷贝MarkWord到栈的LockRecord中,使用CAS将MarkWord中的LockWord更新为指向当前线程LockRecord的指针
  • 默认自旋10次失败,升级重量级锁
重量级锁:
  • 依赖于操作系统Mutex Lock所实现的锁我们称之为 “重量级锁”
重量级锁、轻量级锁和偏向锁之间转换:

锁升级的详细过程:

底层实现:
  • Java的对象头(Mark Word)和Monitor(监视器)对象是Synchronized实现的基础。Synch基于进入和退出Monitor对象实现的同步,Synch使用的锁是存在于Java对象头中。
  • Synchronized是通过对象内部的一个叫做"监视器锁(Monitor)"来实现的。但是监视器锁本质又是依赖于底层的操作系统的Mutex Lock来实现的。而操作系统实现线程之间的切换这就需要从用户态转换到核心态,这个成本非常高,状态之间的转换需要相对比较长的时间,这就是为什么Synchronized效率低的原因。
1. 字节码层面:

访问标识(access flags):ACC_SYNCHRONIZED

monitorenter指令 monitorexitr指令

2. JVM层面:

C++ 调用了操作系统提供的同步机制

3. OS和硬件层面(了解):

X86系统 : lock cmpxchg / xxx

https://blog.csdn.net/21aspnet/article/details/88571740

synchronized的经典小题:

1. 不使用synchronized的非线程安全(线程不安全)举例:

见com.hanxiaozhang.threadbase1ndedition.synchronizedkeyword.No1NonThreadSafe

模拟银行账号:对业务写方法加锁,对业务读方法不加锁,这样行不行? -> 容易产生脏读(dirtyRead)

见com.hanxiaozhang.threadbase1ndedition.synchronizedkeyword.No2DirtyRead

2. 同步与非同步方法是否可以同时调用?

可以

见com.hanxiaozhang.threadbase1ndedition.synchronizedkeyword.No4SynchAndNonSynchMethod

3. synchronized在普通方法与静态方法的区别:

普通方法同步范围是该方法,是给对象上锁;静态方法同步范围是该方法,是给Class类上锁,这个类所有的对象竞争一把锁。

锁:

执行时间短(加锁代码),线程数少,用自旋锁

执行时间长,线程数多,用系统锁(重量级锁)

Volatile关键字:

特点:

  • 保证线程可见性;
    • 底层实现:MESI 缓存一致性协议

见com.hanxiaozhang.threadbase1ndedition.no2volatilekeyword.No1VolatileVisibility

  • 禁止指令重排序;
    • DCL单例(Double Check Lock)
    • 底层实现:内存屏障,loadfence原语指令(读屏障),storefence原语指令(写屏障)

见com.hanxiaozhang.threadbase1ndedition.no2volatilekeyword.No2VolatileDisOrder

底层实现:

1. 字节码层面:

增加访问标识(access flags): ACC_VOLATILE

2. JVM层面:

volatile内存区的读写都加屏障

3.OS和硬件层面:

使用hsdis(HotSpot Dis Assembler)工具观察,windows是由lock 指令实现 | MESI实现

https://blog.csdn.net/qq_26222859/article/details/52235930

Tips:

对象初始化过程,分为三步,可能会发生重排序

CAS(Compare And Swap):

介绍:

CAS(CompareAndSwap)中文意思:比较并替换,它是一种无锁算法。CAS有3个操作数:内存地址V,旧的预期值A,即将要更新的目标值B。

CAS指令执行时,当且仅当V的值与A相等时,将V修改为B,否则就什么都不做,整个CAS操作是一个原子操作。

特点:

CAS是原子操作,CAS具有关键字volatile读和写的内存语义。

三大问题:

  • 循环时间长开销很大;
  • 只能保证一个变量的原子操作;
  • ABA问题。

UnSafe类:

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

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

相关文章

《模拟联合国2.9—团队协作》

感谢上海财经大学持续的邀请,今天在阶梯教室举办的《模拟联合国2.0—团队协作》沙盘课程圆满结束。尽管场地的限制带来了一定的挑战,但得益于系统思考中“结构影响行为”的原则,我得以在不同场景中巧妙设计课程结构,极大地促进了大…

【JavaScript复习二】选择结构if和Switch(1)

### []( )2、单分支条件分支语句if (条件表达式) { // 条件为真时,做的事情 } else { // 条件为假时,做的事情 } ### []( )2,、多分支的 if 语句if (条件表达式1) { // 条件1为真时,做的事情} else if (条件表达式2) { // 条件1不满足&…

股票交易系统

效果展示,如下动图: 首先简述一下股票交易规则: 买卖股票,股民可以自行选择股票的买入或卖出价格和股票的数量,但是用户不一定马上就交易成功,只有当股票价格低于买入价才有机会买入,高于卖出价…

ccie在香港值钱吗?ccie认证很难考吗?

思科ccie认证可以算得上是网络高级工程师的一个标配证书,特别是在香港工作的朋友更是需要尽早拿下这个认证,它能让你的求职之路更为顺利。而已经入职的工程师为了不被时代所淘汰,也需要该证书保驾护航。 你知道ccie在香港值钱吗?ccie认证是不…

redis高可用-哨兵机制

一:背景 上一节我们已经实现了redis的主从同步,从而实现服务的流量分摊和数据高可用,但是出现故障以后,需要人工手动接入,手动切换主从,来实现故障转移。这是比较麻烦的,毕竟人不能实时盯着服务…

Covalent实现对1000亿笔链上交易解析,支持AI长期数据可用性

在区块链与人工智能(AI)交汇处,讨论往往集中于去中心化推理和去中心化训练等方面。然而,这一数据的关键组成部分却一直未得到足够的重视。一个主要问题是:我们如何保护 AI 模型中的数据不受偏见和操纵的影响&#xff1…

【计算机组成原理】指令系统考研真题详解之拓展操作码!

苏泽 “弃工从研”的路上很孤独,于是我记下了些许笔记相伴,希望能够帮助到大家 另外,利用了工作之余的一点点时间,整理了一套考研408的知识图谱, 我根据这一套知识图谱打造了这样一个408知识图谱问答系统 里面的每一…

C语言的网络编程

目录 引言 一、TCP/IP概述 1. TCP(Transmission Control Protocol) 2. UDP(User Datagram Protocol) 二、Socket编程基础 1. 服务器端 2. 客户端 三、URL与HTTP编程 1. 使用libcurl进行HTTP请求 表格总结 TCP/IP与Socke…

镭速传输界面优化之静态文件加载

镭速一直是众多企业传输大文件和大数据的优选对象,速度快、稳定且安全是市场上传输软件脱颖而出的立杆标签,那么同样在界面优化和体验的强大也能够给企业用户带来许多直观的感受,那么今天我们就来谈谈镭速是如何做到这些的,在界面…

【锐捷】VSU环境下部署VAC

配置要求 1.两台核心交换机部署VSU,Domain ID为1,S1的Switch ID为1,优先级为150,设备描述为VSU-S1;S2的Switch ID为2,优先级为120,设备描述为VSU-S2;两台设备的G0/48口用于BFD双机检…

go语言对接S3存储的SDK(支持minio和OSS)

背景 在某个项目中,客户要求支持S3协议的存储,因为之前的项目是go来开发的支持的oss和minio 。 但并不一定支持S3的协议,而且使用了二种SDK,感觉比较麻烦。 既然客户提出来了要求。那我们改一下就是了。 操作 引入 go语言中有对…

中国最全的hive sql 函数集合(持续更新)

#6/20/24 增加greatest函数: select greatest(1,2,3,4,5,2) 结论:可以用hive presto spark得出正确的结果值 #6/20/24 增加last_value(cl1) ignore nulls over(order by ts ) as dt 函数: 有数据集: 1 1 1 2 2   3 3 …

振幅调制与解调电路

本章学习内容与重难点 调制的原因 调制就是把低频信号的信息带到高频信号上。 减小天线长度 天线长度与所接收的信号的波长正相关,调制到高频再发送能极大幅度降低接收成本。 避免信号干扰 利用调制将信号抬到不同的通频带,可以有效避免信号频率交叠的相…

Unity制作背包的格子

1.新建一个面板 2.点击面板并添加这个组件 3.点击UI创建一个原始图像,这样我们就会发现图像出现在了面板的左上角。 4.多复制几个并改变 Grid Layout Group的参数就可以实现下面的效果了

汽车信息安全硬件讨论:SE vs HSM

目录 1.什么是Secure Element 2.芯片内置HSM和SE 3.未来HSM的发展 现在的智能网联汽车看起来像是一个连接万物的智能移动终端,它不仅可以与OEM云服务器通信接收OTA推送,还可以与手机蓝牙、Wifi交互完成远程汽车解锁、座舱内环境设置等等,借…

2004年下半年软件设计师【下午题】试题及答案

文章目录 2004年下半年软件设计师下午题--试题2004年下半年软件设计师下午题--答案2004年下半年软件设计师下午题–试题

osgearth提示“simple.earth: file not handled”

在用vcpkg编译完osg和osgearth后,为了验证osgearth编译是否正确,进行测试,模型加载代码如下: root->addChild(osgDB::readNodeFile("simple.earth")); 此时以为是simple.earth路径的问题,遂改为以下代码…

手把手教程 | 云端部署语音合成神器——ChatTTS

近期,ChatTTS 凭借其高度仿真的 AI 语音合成技术迅速走红!ChatTTS 是专为对话场景设计的文本转语音模型,例如 LLM 助手对话任务,支持中英文两种语言。其最大的模型在超过 10 万小时的中英文数据上进行训练,确保了高质量…

【机器学习300问】126、词嵌入(Word Embedding)是什么意思?

人类的文字,作为一种高度抽象化的符号系统,承载着丰富而复杂的信息。为了让电脑也能像人类一样理解并处理这些文字,科学家们不断探索各种方法,以期将人类的语言转化为计算机能够理解的格式。 一、One-Hot编码的不足 在自然语言处…

Sklearn中逻辑回归建模

分类模型的评估 回归模型的评估方法,主要有均方误差MSE,R方得分等指标,在分类模型中,我们主要应用的是准确率这个评估指标,除此之外,常用的二分类模型的模型评估指标还有召回率(Recall&#xff…