您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

多线程场景下编码的一些思考

时间:2020-06-30 15:46:55  来源:  作者:

背景

编写一个单例的实现。这里采用一个双重检查方式。

多线程场景下编码的一些思考

image.png

发现是有问题的。主要是编译优化导致new 对象的顺序和可见性问题。

问题修复 :只需要再单例对象 加上 volatile 修饰即可。

分析背后的原因

多线程编程中主要核心关注如下三个点 :

可见性

缓存带来的原子性 (硬件的坑)

原子性

线程切换带来的原子性

有序问题

编译优化,内存模型一般原则(HAppens-Before)

多线程场景下编码的一些思考

image.png

这里给出一个volatile 修饰的对象 new 对象在编译后的执行字节码流程,可以看出没有做编译优化和顺序重排。

JAVA并发常见的内存模型

valatile :禁

这条规则是指一个valatile 变量的写操作

Happens-Before 于后续对这个 valatile变量的读操作

le变量的读操作

final :

编译优化更好点 ,生而不变,可以使劲的优化

传递性:

 

Happens-Before: 前面的操作结果对后续的操作是可见的

x = 7 y = 8 在多线程中,

传递性 是指 :

线程A:写 X =7 Y =8 成功

线程B:如果读到 y = 8 ,

那么他读到的X 肯定是7

Java 采用的是管程技术,synchronized 关键字及 wait()、notify()、notifyAll() 这三个方法都是管程的组成部分。

而管程和信号量是等价的,所谓等价指的是用管程能够实现信号量,也能用信号量实现管程。但是管程在利用OOP的封装特性解决了信号量在工程实践上的复杂性问题,因此java采用管理机制。

因此java

就是将共享变量及其对共享变量的操作统一封装起来。在下图中,管程 X 将共享变量 queue 这个队列和相关的操作入队 enq()、出队 deq() 都封装起来了;线程 A 和线程 B 如果想访问共享变量 queue,只能通过调用管程提供的 enq()、deq() 方法来实现;enq()、deq() 保证互斥性,只允许一个线程进入管程。管程模型和面向对象高度契合的。

多线程场景下编码的一些思考

image.png

管程如何解决线程间的同步问题呢?

Java 参考了 MESA 模型,语言内置的管程(synchronized)对 MESA 模型进行了精简。MESA 模型中,条件变量可以有多个,Java 语言内置的管程里只有一个条件变量。具体如下图所示。

多线程场景下编码的一些思考

image.png

JAVA SDK并发包通过Lock 和Condition两个接口’又’实现了一次管程。LOCK 解决互斥,Condition解决同步问题

重复造轮子

1.能够响应终端

2.支持超时

3. 非阻塞获取锁

多线程场景下编码的一些思考

image.png

轮子的理由:

1.能够响应终端

2.支持超时

先找到一个 阻塞的线程 看执行栈信息

多线程场景下编码的一些思考

image.png


多线程场景下编码的一些思考

image.png



Tags:多线程   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
一文看懂"async"和“await”关键词是如何简化了C#中多线程的开发过程当我们使用需要长时间运行的方法(即,用于读取大文件或从网络下载大量资源)时,在同步的应用程序中,应用程序本...【详细内容】
2021-12-01  Tags: 多线程  点击:(24)  评论:(0)  加入收藏
相关概念 并发和并行 并发:指一个时间段内,在一个CPU(CPU核心)能运行的程序的数量。 并行:指在同一时刻,在多个CPU上运行多个程序,跟CPU(CPU核心)数量有关。因为计算机CPU(CPU核心)在同...【详细内容】
2021-11-30  Tags: 多线程  点击:(18)  评论:(0)  加入收藏
一、现代计算机理论模型与工作方式现代计算机模型是基于-冯诺依曼计算机模型。计算机在运行时,先从内存中取出第一条指令,通过控制器的译码,按指令的要求,从存储器中取出数据进...【详细内容】
2021-07-19  Tags: 多线程  点击:(87)  评论:(0)  加入收藏
public class SReactorSThread { private Selector selector; private ServerSocketChannel serverSocketChannel; private int PORT = 6666; public SReactorS...【详细内容】
2021-05-25  Tags: 多线程  点击:(779)  评论:(0)  加入收藏
并发与并行分布式系统的一个重要特征就是计算能力是可以并发或者并行的。在分布式系统中,往往会将一个大任务进行分解,而后下发给不同的节点去计算,从而节省整个任务的计算时间...【详细内容】
2021-04-15  Tags: 多线程  点击:(235)  评论:(0)  加入收藏
年轻人,醒醒吧!此时不搏何时搏!本文主要讲一下常见的CAS理论。再者就是说一下锁的分类,什么乐观锁啊,悲观锁、重入锁等等。这篇文章要一网打尽,都介绍一下。把CAS按在地上摩擦中文...【详细内容】
2020-12-08  Tags: 多线程  点击:(100)  评论:(0)  加入收藏
你真的了解多线程吗?如果问你“为什么多线程可以提高程序运行效率?”,想必你会说“计算机并行执行任务啊,当然效率高!” 这显然不是一个内行该给出的答案。要知道,一个 CPU 在任何...【详细内容】
2020-11-10  Tags: 多线程  点击:(142)  评论:(0)  加入收藏
最近定位了在一个多线程服务器程序(OceanBase MergeServer)中,一个线程非法篡改另一个线程的内存而导致程序core掉的问题。定位这个问题历经曲折,尝试了各种内存调试的办法。往...【详细内容】
2020-10-27  Tags: 多线程  点击:(152)  评论:(0)  加入收藏
一、什么是分布式?分布式更多的是一个概念,是为了解决单个物理服务器容量和性能瓶颈问题而采用的优化手段,该领域需要解决的问题极多,在不同的技术层面上,又包括:分布式文件系统...【详细内容】
2020-10-14  Tags: 多线程  点击:(91)  评论:(0)  加入收藏
作为一个程序员,线程,进程,协程这些是我们必须要掌握的最基础的知识,这就好比数学家必须要学习的基本几何原理一样,没有它们,我们在编程的世界里寸步难行。并发和并行并发和并行是...【详细内容】
2020-10-09  Tags: 多线程  点击:(97)  评论:(0)  加入收藏
▌简易百科推荐
本文分为三个等级自顶向下地分析了glibc中内存分配与回收的过程。本文不过度关注细节,因此只是分别从arena层次、bin层次、chunk层次进行图解,而不涉及有关指针的具体操作。前...【详细内容】
2021-12-28  linux技术栈    Tags:glibc   点击:(3)  评论:(0)  加入收藏
摘 要 (OF作品展示)OF之前介绍了用python实现数据可视化、数据分析及一些小项目,但基本都是后端的知识。想要做一个好看的可视化大屏,我们还要学一些前端的知识(vue),网上有很多比...【详细内容】
2021-12-27  项目与数据管理    Tags:Vue   点击:(2)  评论:(0)  加入收藏
程序是如何被执行的  程序是如何被执行的?许多开发者可能也没法回答这个问题,大多数人更注重的是如何编写程序,却不会太注意编写好的程序是如何被运行,这并不是一个好...【详细内容】
2021-12-23  IT学习日记    Tags:程序   点击:(9)  评论:(0)  加入收藏
阅读收获✔️1. 了解单点登录实现原理✔️2. 掌握快速使用xxl-sso接入单点登录功能一、早期的多系统登录解决方案 单系统登录解决方案的核心是cookie,cookie携带会话id在浏览器...【详细内容】
2021-12-23  程序yuan    Tags:单点登录(   点击:(8)  评论:(0)  加入收藏
下载Eclipse RCP IDE如果你电脑上还没有安装Eclipse,那么请到这里下载对应版本的软件进行安装。具体的安装步骤就不在这赘述了。创建第一个标准Eclipse RCP应用(总共分为六步)1...【详细内容】
2021-12-22  阿福ChrisYuan    Tags:RCP应用   点击:(7)  评论:(0)  加入收藏
今天想简单聊一聊 Token 的 Value Capture,就是币的价值问题。首先说明啊,这个话题包含的内容非常之光,Token 的经济学设计也可以包含诸多问题,所以几乎不可能把这个问题说的清...【详细内容】
2021-12-21  唐少华TSH    Tags:Token   点击:(10)  评论:(0)  加入收藏
实现效果:假如有10条数据,分组展示,默认在当前页面展示4个,点击换一批,从第5个开始继续展示,到最后一组,再重新返回到第一组 data() { return { qList: [], //处理后...【详细内容】
2021-12-17  Mason程    Tags:VUE   点击:(14)  评论:(0)  加入收藏
什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么时候来进行性能调优?(who) 怎么样进行性能调优?(How) 硬件配...【详细内容】
2021-12-16  软件测试小p    Tags:性能调优   点击:(20)  评论:(0)  加入收藏
Tasker 是一款适用于 Android 设备的高级自动化应用,它可以通过脚本让重复性的操作自动运行,提高效率。 不知道从哪里听说的抖音 app 会导致 OLED 屏幕烧屏。于是就现学现卖,自...【详细内容】
2021-12-15  ITBang    Tags:抖音防烧屏   点击:(25)  评论:(0)  加入收藏
11 月 23 日,Rust Moderation Team(审核团队)在 GitHub 上发布了辞职公告,即刻生效。根据公告,审核团队集体辞职是为了抗议 Rust 核心团队(Core team)在执行社区行为准则和标准上...【详细内容】
2021-12-15  InfoQ    Tags:Rust   点击:(25)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条