【Java并发编程的艺术学习】第三章摘要补全

第三章整篇依旧围绕写后读这一核心,本文章目的是为更好的了解学习,所以会添加一些必须了解的知识,同样也会对文章重要内容进行摘要。

3.1Java内存模型的基础

1.线程之间如何通信

方式一:使用 volatile 关键字

基于 volatile 关键字来实现线程间相互通信是使用共享内存的思想,大致意思就是多个线程同时监听一个变量,当这个变量发生变化的时候 ,线程能够感知并执行相应的业务。这也是最简单的一种实现方式。

方式二:使用Object类的wait() 和 notify() 方法

Object类提供了线程间通信的方法:wait()、notify()、notifyaAl(),它们是多线程通信的基础,而这种实现方式的思想自然是线程间通信。注意: wait和 notify、notifyaAl必须配合synchronized使用,wait方法释放锁,notify方法不释放锁

方式三:使用JUC工具类 CountDownLatch

jdk1.5之后在java.util.concurrent包下提供了很多并发编程相关的工具类,简化了我们的并发编程代码的书写,CountDownLatch基于AQS框架,相当于也是维护了一个线程间共享变量state

方式四:使用 ReentrantLock 结合 Condition

方式五:基本LockSupport实现线程间的阻塞和唤醒

LockSupport 是一种非常灵活的实现线程间阻塞和唤醒的工具,使用它不用关注是等待线程先进行还是唤醒线程先运行,但是得知道线程的名字。

原文链接:线程之间的通信方式_线程通信-CSDN博客

2.进程之间如何通信

管道

管道本质上就是内核中的一个缓存,当进程创建一个管道后,Linux会返回两个文件描述符,一个是写入端的描述符,一个是输出端的描述符,可以通过这两个描述符往管道写入或者读取数据。

如果想要实现两个进程通过管道来通信,则需要让创建管道的进程fork子进程,这样子进程们就拥有了父进程的文件描述符,这样子进程之间也就有了对同一管道的操作。
消息队列

A进程往消息队列写入数据后就可以正常返回,B进程需要时再去读取就可以了,效率比较高。

而且,数据会被分为一个一个的数据单元,称为消息体,消息发送方和接收方约定好消息体的数据类型,不像管道是无格式的字节流类型,这样的好处是可以边发送边接收,而不需要等待完整的数据。

共享内存

不同的进程拿出一块虚拟内存空间,映射到相同的物理内存空间。这样一个进程写入的东西,另一个进程马上就能够看到,不需要进行拷贝。

信号量

信号

Socket
 

原文链接:进程间的通信方式(六种)_进程间通信-CSDN博客

3.显式:人为

隐式:非人为

4.什么是happens-before

在Java中,如果一个操作happens-before另一个操作,那么第一个操作的结果将对第二个操作可见,即第二个操作可以看到第一个操作的影响。

3.2重排序

1.发生以下情况就不可以重排序

2.as-if-serial语句的意思

不管怎么重排序(编译器和处理器为了提高并行度),(单线程)程序的执行结果不能被改变。编译器、runtime和处理器都必须遵守as-if-serial语义

3.3顺序一致性

1.什么是事务

多次操作,具有原子特征,对于这一系列操作要么都成功要么都失败

3.6final

1.final的工作量较volatile轻一些,所以在部分场景下final比volatile快

2.final防止指令重排序

3.8双重检查锁定与延迟初始化

1.枚举类只有一个对象,当枚举类第一次用到的时候就存在于内存中

2.单例模式:一个类中只有一个对象

3.实现单例模式的方式:枚举(最简单的方式),懒加载(使用时加载)

枚举缺点:一加载进内存它的对象就存在,所以内存消耗比较大

4.该代码来源于菜鸟教程 单例模式 | 菜鸟教程 (runoob.com)
public class Singleton {  private volatile static Singleton singleton;  //该语句中volatile含义:第一个线程成功创建对象时值可能为空,没有的话后续其他线程知道不及时可能进入阻塞队列,有则保证其他线程及时知道不为空防止进入阻塞队列。
//这个为什么是静态?静态方法只能操作静态对象,所以受下面静态方法影响,该语句只能是静态的。private Singleton (){}  //构造方法私有代表不允许创建对象,其他线程不允许newpublic static Singleton getSingleton() {  //每个线程只能通过这个方法访问对象,为什么这个方法是静态的?因为非静态方法需要创建对象,而在这段代码中是不允许创建对象的if (singleton == null) {  synchronized (Singleton.class) {  if (singleton == null) {  singleton = new Singleton();  }  }  }  return singleton;  }  
}

执行过程:假设此时有n个线程想使用该对象,通过getSingleton方法,首先判断第一个if语句

此时该对象没有被上锁,if判断为true进入下一步

此时进入8个恰好时间片到了,那么(x-4)个留在外面,4个进入执行下一步

对类进行加锁

第二个if再次判断,发现类已经被上锁,拦截剩下三个并进入阻塞队列

第一个拿到对象

第一个if语句还有一个作用,当时间片再次轮到该进程时,其他线程想通过该方法时会发现该对象已经被上锁

后续:写的很菜,有错误的话希望大佬指出,上面附带的原文转载写的都很不错,我把这个彻底弄明白了会再写一版,各位都加油

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

表情包搜索网站

一个非常不错的表情包搜索网站,输入关键词即可得到所有相关的表情,还可以选择套图下载,自制表情,非常给力666 可以点击下载,会新建窗口打开图片,鼠标右键“图片另存为”,下载文件名手动补充“…

在Pyqt5的QtWidgets.QGraphicsView上绑定matplotlib.figure实现绘图

matplotlib的基础类figure相当于一个View窗口类(实际上,每一个figure是由更底层canvas来控制的,大概有点类似CAD的layers层的概念),是一个可绘制显示图形的View区域,也称画布(figure&#xff09…

零代码也能玩出花:Mugeda在H5设计中的魔法力量

文章目录 一、Mugeda零代码可视化H5设计工具简介二、Mugeda零代码可视化H5设计实战案例1. 注册并登录Mugeda账号2. 选择模板3. 编辑页面内容4. 添加动画效果5. 预览和发布 三、Mugeda零代码可视化H5设计的优势《Mugeda零代码可视化H5设计实战》内容简介作者简介目录前言/序言 随…

小型内衣洗衣机什么牌子好?口碑好的小型洗衣机

想必大家都知道,我们的内衣裤、袜子这些衣物对卫生方面的要求是比较的高,毕竟是贴身的衣物,因此是要分开清洗的,而不能够跟我们其他的大件衣服一起放入到大型洗衣机里进行混洗,很多就选择了分开单独的手洗,…

萨科微宋仕强论道之华强北国际化(二十二)

华强北以前的客户基本在国内,有一部分外贸生意但是规模不大,华强北要不要国际化?如何国际化?国际化的前景如何呢? 华强北国际化有很多优势。比如目前往墨西哥转的汽车供应链和往越南印度转的手机供应链,与其他制造业的…

Mybatis中的多表查询

多表查询的结构分为: 一对一 一对多(多对一) 多对多 根据不同情况下使用不同的处理方式 一对一 一对一方式一般都是,一个身份证对应一个人,一个商品订单对应一个消费者…… 以商品为例子来经行说明 创建一个用户表和商品表 用户表 商…

Gamma LUT PG285笔记

1 gamma校正应用背景 探测器响应为线性亮度或RGB值,而显示器并非线性,需要算法做校正。 2 reg 可以配置3张LUT表,每张表最大1024个16bit参数。表中0x0800仅是第一张表的起始地址,地址每次加4。 3 数据输入的格式 按照RBG的顺序…

bat命令清理Window应用注册表(Unity开发Window应用)

bat命令清理Window应用注册表(Unity开发Window应用) 介绍出现的问题方案一方案二方案二解决方案1. 首先使用【Win】【R】组合快捷键,快速打开运行命令框,在打开后面键入命令:【Regedit】2. 完后后按回车键(…

作为开发人员掌握 GitHub Copilot:15 个提示和技巧

目录 Copilot 的炫酷用例 为您完成代码 从代码编写测试 TDD:通过测试编写代码 测试/模拟数据生成 从注释中编写代码 问:&答: 颜色生成 使用测量单位 自然语言翻译 自动化脚本 正则表达式 配置 命令行命令 文档和自述文本 if (true) 技巧 …

Android Studio修改创建新布局时默认根布局

将Android Studio默认布局ConstraintLayout切换成LinearLayout 打开设置, Editor> File and Code Templates > Other > layoutResourceFile.xml 备注:创建时提示根布局仍然为ConstraintLayout,不用管这个,实际创建的…

进阶版求字符串长度

大家好呀!!!我是Beilef,一个努力的跨界者,今天带来的每日一题是用简单的函数还有递归求字符串长度。下面开始啦,不对的地方请留言。感谢您的斧正。 文章目录 目录 文章目录 前言 一、题目展示 解题思路&am…

年终回顾与展望:CSDN成就之路,2023年AI浪潮展望及2024 Flag

文章目录 2023年在CSDN获得的肯定1,入围2023博客之星2,《有哪些让你目瞪口呆的Bug?》征文获得TOP33,通过创作者身份认证4,多篇文章被城市开发者社区收录5,多篇文章进入全站综合热榜6,积极参与社…

2023启示录丨自动驾驶这一年

图片|《老人与海》插图 过去的20年,都没有2023年如此动荡。 大模型犹如一颗原子弹投入科技圈,卷起万里尘沙,传统模式瞬间被夷为平地,在耀眼的白光和巨大的轰鸣声之下,大公司、创业者、投资人甚至是每一位观…

Unity Shader 实现X光效果

Unity Shader 实现X光效果 Unity Shader 实现实物遮挡外轮廓发光效果第五人格黎明杀机火炬之光 实现方案操作实现立体感优化总结源码 Unity Shader 实现实物遮挡外轮廓发光效果 之前看过《火炬之光》、《黎明杀机》、《第五人格》等不少的游戏里面人物被建筑物遮挡呈现出不同的…

小型洗衣机怎么用?高质量的小型洗衣机推荐

清洗内衣内裤这些贴身衣物确实是一件比较头疼的事,有的小伙子由于工作的劳累通常在洗完澡后并不喜欢直接清洗内衣内裤,会存上几天再扔到洗衣机里,这样做是很不可取的,因为穿过的内裤很久不洗就会滋生细菌,另外&#xf…

VSCode安装Go环境

VSCode安装Go 1.点击Go官网,根据自己环境下载go安装包,我这里为Windows 2.双击安装包,一直点击【Next】即可 VSCode配置Go基础环境 1.创建Go的工作目录: C:\Code\GoCode 2.创建Go的环境变量: GOPATH (1)右键【此电脑】,点击…

RHCE9学习指南 第11章 网络配置

11.1 网络基础知识 一台主机需要配置必要的网络信息,才可以连接到互联网。需要的配置网络信息包括IP,子网掩码,网关和DNS。 11.1.1 IP地址 在计算机中对IP的标记使用的是32bit的二进制,例如, 11000000 10101000 00…

68内网安全-域横向PTHPTKPTT哈希票据传递

今天讲PTH&PTK&PTT, PTH(pass the hash) #利用 lm 或 ntlm 的值进行的渗透测试 PTT(pass the ticket) #利用的票据凭证 TGT 进行的渗透测试 用的Kerberos 协议 PTK(pass the key) #利用的 ekeys aes256 进行的渗透测试 lm加密算法是2003以前的老版&…

EST-100身份证社保卡签批屏按捺终端PC版web版本http协议接口文档,支持web网页开发对接使用

<!DOCTYPE html><html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width,initial-scale1.0"><title>演示DEMO</title><script type"text/…

低频RFID读写器畜牧业系列介绍

近些年&#xff0c;畜牧行业普遍从传统的分散养殖模式逐渐转化为集约化、规模化养殖&#xff0c;由于集中养殖的禽畜数量多&#xff0c;人工识别与管理的难度大&#xff0c;落后的管理制度不能够很好地满足集约化生产和管理的需要。而被誉为21世纪最具发展潜力的信息技术之一&a…