并发(concurrency)和并行(parallellism)

并发:是指同一个时间段内多个任务同时都在执行,并且都没有执行结束。并发任务强调在一个时间段内同时执行,而一个时间段由多个单位时间累积而成,所以说并发的多个任务在单位时间内不一定同时在执行 。

并行:是说在单位时间内多个任务同时在执行 。

在多线程编程实践中,线程的个数往往多于CPU的个数,所以一般都称多线程并发编程而不是多线程并行编程。

并发过程中常见的问题:

1、线程安全问题:

多个线程同时操作共享变量1时,会出现线程1更新共享变量1的值,但是其他线程获取到的是共享变量没有被更新之前的值。就会导致数据不准确问题。

2、共享内存不可见性问题

Java内存模型(处理共享变量)

Java 内存模型规定,将所有的变量都存放在主内存中,当线程使用变量时,会把主内存里面的变量复制到自己的工作空间或者叫作工作内存,线程读写变量时操作的是自己工作内存中的变量 。(如上图所示)

(实际工作的java内存模型)

上图中所示是一个双核 CPU 系统架构,每个核有自己的控制器和运算器,其中控制器包含一组寄存器和操作控制器,运算器执行算术逻辅运算。CPU的每个核都有自己的一级缓存,在有些架构里面还有一个所有CPU都共享的二级缓存。 那么Java内存模型里面的工作内存,就对应这里的 Ll或者 L2 缓存或者 CPU 的寄存器

1、线程A首先获取共享变量X的值,由于两级Cache都没有命中,所以加载主内存中X的值,假如为0。然后把X=0的值缓存到两级缓存,线程A修改X的值为1,然后将其写入两级Cache,并且刷新到主内存。线程A操作完毕后,线程A所在的CPU的两级Cache内和主内存里面的X的值都是l。

2、线程B获取X的值,首先一级缓存没有命中,然后看二级缓存,二级缓存命中了,所以返回X=1;到这里一切都是正常的,因为这时候主内存中也是X=l。然后线程B修改X的值为2,并将其存放到线程2所在的一级Cache和共享二级Cache中,最后更新主内存中X的值为2,到这里一切都是好的。

3、线程A这次又需要修改X的值,获取时一级缓存命中,并且X=l这里问题就出现了,明明线程B已经把X的值修改为2,为何线程A获取的还是l呢?这就是共享变量的内存不可见问题,也就是线程B写入的值对线程A不可见。

synchronized 的内存语义:

这个内存语义就可以解决共享变量内存可见性问题。进入synchronized块的内存语义是把在synchronized块内使用到的变量从线程的工作内存中清除,这样在synchronized块内使用到该变量时就不会从线程的工作内存中获取,而是直接从主内存中获取。退出synchronized块的内存语义是把在synchronized块内对共享变量的修改刷新到主内存。会造成上下文切换的开销,独占锁,降低并发性

Volatile的理解:

该关键字可以确保对一个变量的更新对其他线程马上可见。当一个变量被声明为volatile时,线程在写入变量时不会把值缓存在寄存器或者其他地方,而是会把值刷新回主内存。当其他线程读取该共享变量时-,会从主内存重新获取最新值,而不是使用当前线程的工作内存中的值。volatile的内存语义和synchronized有相似之处,具体来说就是,当线程写入了volatile变量值时就等价于线程退出synchronized同步块(把写入工作内存的变量值同步到主内存),读取volatile变量值时就相当于进入同步块(先清空本地内存变量值,再从主内存获取最新值)。不能保证原子性

YUKX优科学习网

本文内容及图片来源于网上摘录或读者投稿

java并行安全吗_并发和并行有什么区别相关推荐

  1. java 并行与并发_并发与并行的区别是什么?

    详细请参考:Concurrency vs. Parallelism​tutorials.jenkov.com [Concurrency] 并发的反义词是顺序,concurrency vs sequen ...

  2. java 并发和并行_并发和并行性有什么区别?

    并发和并行性有什么区别? 示例被赞赏. #1楼 并发性:具有共享资源潜力的多个执行流 例如:两个线程争用一个I / O端口. 平行主义:将问题分成多个相似的块. 例如:通过在文件的每半部分上运行两个进 ...

  3. 多线程是并行还是并发_并发,并行,线程,进程,异步和同步有相关性吗?

    本文翻译自:https://medium.com/swift-india/concurrency-parallelism-threads-processes-async-and-sync-relate ...

  4. java线程本地存储_[并发并行]_[C/C++]_[使用线程本地存储Thread Local Storage(TLS)-win32和pthread比较]...

    场景: 1.  需要统计某个线程的对象上创建的个数. 2. 当创建的堆空间需要根据线程需要创建和结束时销毁时. 3. 因为范围是线程只能看到自己的存储数据,所以不需要临界区或互斥量来维护自己的堆内存. ...

  5. 并发 线程交替执行_并发与并行的区别

    简要可以理解为: (1)并行是指两个或者多个事件在同一时刻发生:而并发是指两个或多个事件在同一时间间隔发生. (2)并行是在不同实体上的多个事件,并发是在同一实体上的多个事件. (3)在一台处理器上& ...

  6. python并行for循环_通过python并行运行for循环

    我有一个进程循环访问IP地址列表并返回有关它们的一些信息.simple for循环工作得很好,我的问题是由于Python的全局解释器锁(GIL)而大规模地运行这个循环.在 我的目标是让这个函数并行运行 ...

  7. java 用户串号_并发时Java HttpSession串号问题

    框架为SpringMVC+Mybatis,在用户登录时候保存用户信息到HttpSession中,而后从Session中获取用户的部分信息.在本地测试中没有问题,但是放到真实环境中,用户产生并发则出现S ...

  8. java字节流转字符串_字节流与字符流的区别及相互转换

    先来看一下流的概念: 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输出都是以流的形 ...

  9. 并发、并行、同步、异步、进程,线程、串行、并行?一文弄懂八大概念

    并发.并行.同步.异步.进程,线程.串行.并行?一文弄懂八大概念 参考博文:并发.并行.串行.同步.异步的区别? java多线程详解(并发,并行,同步) 文章目录 并发.并行.同步.异步.进程,线程. ...

最新文章

  1. noj数据结构稀疏矩阵的加法十字链表_数据结构学习(C )稀疏矩阵(十字链表1)
  2. CentOS7 下面安装Mysql MMM
  3. linux top命令增强版 htop简介
  4. PYPL 12 月 IDE 榜单:Eclipse 有望超越 Visual Studio
  5. C# 索引器使用总结
  6. 如何断开mongodb数据库连接_如何连接远程mongodb数据库
  7. OC第六节 遍历集合、数组排序
  8. Delphi格式化函数Format FormatDateTime和FormatFloat
  9. UnicodeDecodeError: 'utf8' codec can't decode byte 0xd1 in position 0: invalid continuation byte问题
  10. 使用后缀自动机求后缀数组
  11. 第十二周项目2 - 摩托车继承自行车和机动车
  12. WinForms时代结束,报表控件FastReport.NET开启FastReport.Core.Skia 时代!
  13. 【期刊会议】机器学习深度学习 + 计算机视觉(To be continued..)
  14. 使用Docker搭建实验室共享GPU服务器
  15. 云服务器被攻击了怎么解决?恢复需要多久?
  16. mixin(公共样式定义)
  17. window下Nexus私服高级搭建
  18. S32K144 CAN收发调试经验总结
  19. [Android]桌面应用
  20. 解决uniapp退出全屏视频字体变大的bug

热门文章

  1. SMAT,PacBio
  2. 一种PacBio测序数据组装得到的基因组序列的纠错方法
  3. java shape_Java 读取shape文件
  4. 快手小葫芦网红收入大数据_KS第一个粉丝量破亿账号出现,竟是他!送辛巴上央视的网红被曝光!方丈曝出被封杀网红身份信息!球球自爆发家史,偷卖赵本山老师鞋子!...
  5. linux进程间通讯-信号
  6. 二十六、二叉树--查找指定节点
  7. 【建站系列教程】2、数据源
  8. Caffe在Ubuntu 14.04 64bit 下的安装------pycaffe 配置
  9. LeetCode 145. Binary Tree Postorder Traversal--后序遍历--先序遍历反向输出--递归,迭代--C++,Python解法
  10. 在centos上通过yum直接安装最新版gcc和开发工具