并发模型之——共享内存模型(线程与锁)理论篇

      这里我们使用Java的线程与锁来解析共享内存模型;做过java开发并且了解线程安全问题的知道,要使某段代码是线程安全的那必须要满足两个条件:内存可见性、原子性
内存可见性
      在JVM规定多个线程进行通讯是通过共享变量进行的,而Java内存模型规定了有主内存是所有线程共享的,而各个线程又有自己的工作内存,线程只能访问自己的工作内存中数据;
      如:有一个共享变量x,两个线程a、b变量x存储在主内存中然后又两个x的拷贝分别存储在a、b线程的工作内存中线程a、b只能对自己工作内存中的x的拷贝进行操作,不可直接操作主内存;
      线程a对x修改时先把值放到自己的工作内存中,然后再把工作内存中的x拷贝更新到主内存中,线程b同样如此;当线程a更新了主内存后线程b刷新工作内存后就能看到a更新后的最新值这就是内存可见性问题;
      内存可见性要保证两点:1、线程修改后的共享变量更新到主内存;2、从主内存中更新最新值到工作内存中;
      内存可见性:线程对共享变量的修改其他线程可以看到修改后的值;

   
原子性
      当线程引用共享变量时,工作内存中没有共享变量时它会从主内存复制共享变量到自己工作内存中,当工作内存有共享变量时线程可能会从主内存更新也有可能直接使用工作内存中的共享变量;
有代码块,count为共享变量:

1 ++count; 

// count初始值为0,这时有a、b线程都执行这行代码,可能有不少人以为线程a , b执行完成后count的值为2,但真实情况是count最终值可能为1也可能为2,因为这里有一个原子性问题;

     熟悉Java的都知道在Java中++count非原子操作,流程为:
           1、把主内存共享变量count拷贝到工作内存
           2、把工作内存中count值+1
           3、把结果写回更新回主内存
     当只有一个线程时这个操作没有问题;
     当有多个线程时有可能出现:
           1、 线程a把主内存共享变量count拷贝到工作内存
           2、 线程b把主内存共享变量count拷贝到工作内存
           3、 线程a把工作内存中count进行+1
           4、 线程b把工作内存中count进行+1
           5、 线程a把工作内存更新到主内存
           6、 线程b把工作内存更新到主内存
      a,b线程执行完后最终count的值只是1而不是我们期望得到的2,因为这里出现了多个线程交叉执行导致破坏了程序的有序性,而且count+1操作又不是原子的,所以我们必须要保证这程序的原子性,可以使用Java中的synchronized(同步)或Lock机制来解决;

      使用共享内存模型进行并发编程时必须要解决我们上面介绍的两个点:内存可见性、原子性,但现在大部分编程语言原生都支持共享内存模型方式的并发所以我们很容易就可以达到这两个要求;
      现在代码的执行要经过多层的优化对指令重排序,如:编译器、处理器等级别的优化,经过这些优化重排序后最终代码执行顺序可能与之前是不一致的,在单线程时中编译器、处理会保持as-if-serial,对不存在数据依赖的进行重排序,所以不会出现重排序问题;但在多线程情况下就会出现问题,不过还好Java中有些机制可以使程序在编译器、处理器优化时会对有数据依赖的禁止指令重排序,如:volatile、synchronized等,所以我们可以很轻松应对这问题;

 

                                    指令重排序问题
      在Java中我们要使代码在多线程中同时满足内存可见性与有序性那就要使用Java提供给我们的同步与锁机制如:synchronized、volatile、Lock、concurrent类等;
      优点:共享内存模型(线程与锁)可以说是最常见的并发模型大多数编程语言都原生支持,也适合解决很多问题,通过线程与锁实现起来相对也简单点;
      缺点:通过多线程实现并发,而线程耗费的资源比较多,线程总数有限制;通过共享内存来实现多线程通讯又会涉及到锁、竟态、死锁等问题影响程序性能;一不小心就会陷入可见性问题、重排序问题等而且多线程程序不容易测试、维护等;

 

 文章首发地址:Solinx
http://www.solinx.co/archives/179

转载于:https://www.cnblogs.com/softlin/p/4474838.html

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

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

相关文章

谷歌员工怒了 900人联名抗议 刚成立的AI道德委员会处境尴尬

来源:网易智能谷歌员工又怒了。3月26日,谷歌宣布成立人工智能项目外部顾问委员会,该委员会将与谷歌就面部识别和公平性等人工智能的主要问题进行磋商。争议的焦点在于,谷歌将保守派传统基金会(Heritage Foundation)主席凯科尔斯詹…

Opencv——基于索引表的图像细化

图像细化针对的是二值图像 或者用阀值处理的二值图像。基于索引表的细化算法大致是遍历被二值化图像的边缘,根据边缘点的八连通域情况查找索引表以确定该边缘点是否能够被删除。根据一些细化规则我们可以建立索引表,因此我们的主要工作就是不断地遍历边…

DeepMind推出首个商业产品,30秒内准确诊断眼疾!

来源:Financial Times、智东西编译摘要:这个设备能像最好的医学专家一样,准确地诊断各种眼部疾病。4月1日,谷歌母公司Alphabet旗下位于伦敦的AI部门DeepMind已打造出了可诊断复杂眼部疾病的商业医疗设备原型,这将是Dee…

Opencv——Sobel边缘检测

1、代码如下&#xff1a; #include "stdafx.h" #include <opencv2/opencv.hpp>using namespace cv;int main() {Mat srcImage imread("lena.jpg");Mat dstImage_x, dstImage_y;Sobel(srcImage, dstImage_x, CV_8U, 1, 0);Sobel(srcImage, dstImag…

Head first servlet and jsp学习笔记

学习中遇到的问题&#xff1a;java基础不行&#xff0c;都忘光了。 主要是&#xff1a;继承&#xff0c;接口&#xff0c;多线程&#xff0c;IO。尤其是多线程&#xff0c;在分布式系统中应该使用的比较多 第一章&#xff1a;前言和体系结构 HTTP协议&#xff1a; TCP/IP的上层…

一文解析|首个上榜科创板的机器人企业,江苏北人“闯关记”

来源&#xff1a;机器人大讲堂摘要&#xff1a;随着上交所公布了科创板首批受理上市申请的企业名单&#xff0c;这九家企业的每一家都被拿到放大镜下细细观察&#xff0c;评头论足。而其中&#xff0c;江苏北人作为登上科创版的首家机器人企业似乎受到的关注最多。江苏北人是一…

Matlab——绘制基础曲线

1、代码如下&#xff1a; close all;clear all;clc; %关闭所有图形窗口&#xff0c;清除工作空间所有变量&#xff0c;清空命令行 x0:0.02:10; y1sin(x); y22*sin(x); plot(x,y1,b*:,x,y2,r-); %设置颜色、标记和线型 axis([0 pi 0 2]); %设置坐标轴 title(正弦曲…

2018年中美独角兽研究报告

来源&#xff1a;前瞻产业研究院截至2018年12月31日&#xff0c;中国共有205家独角兽企业&#xff0c;占全球独角兽总量的48%&#xff0c;美国共有149家独角兽企业&#xff0c;占全球独角兽总量的35%。中美独角兽行业估值结构差异明显&#xff0c; 但总体看来&#xff0c;对于中…

Matlab——高斯白噪声处理

1、代码如下&#xff1a; close all;clear all;clc; %关闭所有图形窗口&#xff0c;清除工作空间所有变量&#xff0c;清空命令行 Iimread(eight.tif); Aimnoise(I,gaussian,0,0.05); %加入高斯白噪声 JA; M3; %设置叠加次数 Jim2double(J); Iim2…

中国首份自动驾驶路测报告:自主车企全面落后

来源&#xff1a;车云摘要&#xff1a;首份中国自动驾驶路测报告&#xff0c;透露着科技企业的野心和中国车企的无奈。近日&#xff0c;我国首份自动驾驶车辆道路测试年度报告出炉。这份由北京市发布的自动驾驶道路测试报告中&#xff0c;首次披露了自动驾驶相关企业&#xff0…

19个决定性时刻,2030年前,这些黑科技必将发生

来源&#xff1a;科技联盟技术中心摘要&#xff1a;从无人驾驶汽车到机器人工人&#xff0c;在我们熟悉所有这一切之前&#xff0c;未来正迎面走来。根据世界经济论坛全球议程理事会关于《未来软件与社会》的一份报告&#xff0c;到2025年前&#xff0c;很多新兴技术将会达到其…

推荐两本移动开发挺火的书

移动开发最好的入门书&#xff0c;而且例子实战特别多&#xff0c;是大学生的首选。 转载于:https://www.cnblogs.com/book2006/p/4487688.html

Matlab——图像缩放(插值法)

实验内容&#xff1a; 用双线性内插法实现位深度为8的灰度图像的缩放。 思路&#xff1a; 输入原图像以及缩放后图像的像素要求&#xff08;宽度*高度&#xff09;&#xff0c;处理后输出新图像。 我是用matlab来实现scale(input_img,scale_size)函数的&#xff0c;输入图像路径…

情感计算综述

来源&#xff1a;人机与认知实验室自然的齐一性指未检验过的物体将在某些相关的方面与我们已经检验过的同类物体相似。情感是人类智能的重要组成部分&#xff0c;是穿越理性的一把利器&#xff0c;然而&#xff0c;情感计算这一方向能否可行&#xff1f;如同形式化常识一样能否…

Matlab——对比度拉伸

1、代码如下&#xff1a; close all;clear all;clc; %关闭所有图形窗口&#xff0c;清除工作空间所有变量&#xff0c;清空命令行 Iimread(pout.tif); Jimadjust(I,[0.2 0.5],[0 1]);%将0.2-0.5之间的灰度扩展到整个0-1范围&#xff0c;这种处理 对于强调感兴趣灰度区非常有用…

形态学——腐蚀

1、基本概念 腐蚀 是一种消除连通域的边界点&#xff0c;使边界向内收缩的处理。 例如&#xff1a; 注&#xff1a;图像画面上边框处不能被结构元素覆盖的部分可以保持原来的值不变&#xff0c;也可以置为背景。 2、设计思想 设计一个结构元素&#xff0c;结构元素的原点定…

从现在到未来50年,传感器将如何改变世界?

来源&#xff1a;资本实验室2011年&#xff0c;网景公司创始人与风险投资家马克安德森提出了非常具有创见&#xff0c;而且已经成为现实的观点&#xff1a;“软件正在吞噬世界”。到今天&#xff0c;如果把句子中的“软件”替换为“传感器”&#xff0c;这一观点同样适用。自传…

开发过程中编写的一些批处理

1.BuildRelease.bat 用于不开启VS直接编译、部署、创建和恢复快照 WindowsPhone APP&#xff0c;注册WindowsPhone手机。 进行了编译和部署的效果&#xff1a; BuildRelease.bat 1 echo off2 pushd "%~dp0"3 title Build Release4 set folder%CD%5 set MSBUILD%windi…

形态学——膨胀

1、基本概念 膨胀是将与目标区域的背景点合并到该目标物中&#xff0c;使目标物边界向外部扩张的处理。 例如&#xff1a; 2、设计思想 设计一个结构元素&#xff0c;结构元素的原点定位在背景像素上&#xff0c;判断是否覆盖有目标点&#xff0c;来确定是否该点被膨胀为目标…

剖析20世纪未来出行 这些畅想21世纪能成吗?

来源&#xff1a;popsci编译&#xff1a; 网易智能 (乐邦)近年来有关飞行汽车、超级高铁、喷气背包、无人驾驶汽车等新型交通工具的报道一直不绝于耳&#xff0c;但目前这些领域的产品似乎都还算不上真正切实可行。说好的移动出行未来在哪里呢&#xff1f;人们梦寐以求的这些交…