用多线程的目的:更好的利用CPU的资源。因为所有的多线程代码都可以用单线程来实现。

多线程:指的是这个程序(一个进程)运行时产生了不止一个线程。

并行:多个CPU实例或者多台机器同时执行一段处理逻辑,是真正的同时。

并发:通过CPU调度算法,让用户看上去同时执行,实际上从CPU操作层面不是真正的同时。

线程安全:经常用来描绘一段代码。指在并发的情况下,该代码经过多线程使用,线程的调度顺序不影响任何结果。这个时候使用多线程,我们只需要

关注系统的内存,CPU是不是够用即可。

线程不安全:线程的调度顺序会影响最终结果,如不加事务的转账代码。

同步:Java中的同步指的是通过人为的控制和调度,保证共享资源的多线程访问称为线程安全,来保证结果的准确。在保证结果准确的同时,提高性能,才是优秀的程序。

线程安全的优先级高于性能。

Java的并发采用的是共享变量模型

Java线程之间的通信由Java内存模型控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见。

从图中可以看出,如果线程A与线程B之间要通信的话,必须要经历下面两个步骤:

1、线程A把本地内存A中更新过的共享变量刷新到主内存中去。

2、线程B到内存中去读取线程A之前已更新过的共享变量。

可通过下面例子来说明这两个步骤:

如图所示,本地内存A和本地内存B由主内存中共享变量x的副本。假设在最开始时,这3个内存中的x值都为0。线程A在执行时,把更新后的x值(假设值为1)临时存放在自己的本地内存A中。

当线程A和线程B需要通信时,线程A首先会把自己本地内存中修改后的x值刷新到主内存中,此时主内存中的x值变为1.随后,线程B到主内存中去读取线程A更新后的x值,此时线程B的本地内

存的x值也变为1。

从整体来看,这两个步骤实质上是线程A在向线程B发送消息,而且这个通信过程必须要经过主内存。JMM通过控制主内存与每个线程的本地内存之间的交互,来为Java程序员提供内存可见性保证。

参考资料:http://www.jianshu.com/p/40d4c7aebd66

转载于:https://www.cnblogs.com/xh0102/p/5798244.html

Java线程之间通信相关推荐

  1. Java 线程之间通信

    目录 概念 原理 实现 1. 第一种解法,包含多种小的不同实现方式,但一个共同点就是靠一个共享变量来做控制: a. 利用最基本的synchronized.notify.wait: b. 利用Lock和 ...

  2. Java线程间通信-回调的实现方式

    2019独角兽企业重金招聘Python工程师标准>>> Java线程间通信-回调的实现方式 Java线程间通信是非常复杂的问题的.线程间通信问题本质上是如何将与线程相关的变量或者对象 ...

  3. (转载) Android两个子线程之间通信

    Android两个子线程之间通信 标签: classthreadandroid子线程通信 2015-03-20 17:03 3239人阅读 评论(0) 收藏 举报  分类: 个人杂谈 版权声明:本文为 ...

  4. java线程间通信的方式

    java线程间通信的方式 1. 共享变量 2. 等待/通知 3. 管道流 1. 共享变量 volatile修饰的变量,线程间可见,可使用这种变量作为线程间传递消息的媒介: 延伸出来的,还有redis中 ...

  5. JAVA线程之间的通信

    原理 线程的通信可以被定义为:当多个线程共同操作共享的资源时,线程间通过某种方式互相告知自己的状态,以避免无效的资源争夺.线程间通信的方式可以有很多种:等待-通知.共享内存.管道流.每种方式用不同的方 ...

  6. 黑马程序员————java线程之间的通信

    ------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS ...

  7. java线程间通信:一个小Demo完全搞懂

    版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.从一个小Demo说起 上篇我们聊到了Java多线程的同步 ...

  8. java线程间通信_java线程间通信:一个小Demo完全搞懂

    版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.从一个小Demo说起 上篇我们聊到了Java多线程的同步 ...

  9. java 线程间通信 handler_Handler不同线程间的通信

    转http://www.iteye.com/problems/69457 Activity启动后点击一个界面按钮后会开启一个服务(暂定为padService),在padService中会启动一个线程( ...

最新文章

  1. 自学大数据:用以生产环境的Hadoop版本比较
  2. 2018年4月1日 蓝桥杯 C/C++B组答案 递增三元组
  3. python 控制有线网卡_Python 使用指定的网卡发送HTTP请求的实例
  4. vue 父链和子组件索引_vue子组件和父组件双向绑定的几种方案
  5. python3所支持的整数进制_Python3快速入门(三)——Python3标准数据类型
  6. mysql11导入数据_MySQL专题11之MySQL导出数据、MySQL导入数据
  7. Linux下学习进程控制
  8. 三种Perceptual_metric:VGG distance,Inception Score,FID Score的源码
  9. 移动硬盘计算机无图标,移动硬盘不显示盘符但右下角有显示USB图标解决方法
  10. nvidia windows linux,NVIDIA首发OpenGL 3.1驱动 全面支持Windows/Linux
  11. 教你把mov格式的视频转换mp4
  12. 实验物理与工业控制系统---EPICS
  13. 链路预测 matlab,链路预测
  14. 利用rclone同步google storage cloud和aws s3存储
  15. java linux mdb,在Linux下实现对Microsoft Access Database(.mdb)查询访问
  16. 服务器 最大连接数:
  17. 原美团联合创始人欲打造中国版 OpenAI ;ChatGPT 爆红惊动谷歌退隐创始人布林;Gradle 8.0 发布|极客头条
  18. js判断H5页面是否是在QQ\UC浏览器中打开
  19. Cesium 获取当前视图的中心经纬度
  20. 李帅将道访武当山,拜会李光富会长

热门文章

  1. 商家为什么要接受BCH支付?
  2. 关于web前端中文站(www.lisa33xiaoq.net)侵权业余草(www.xttblog.com)相关文章的公告...
  3. Golang并发(五) - Select
  4. mysql limit函数
  5. erlang环境变量——HOME
  6. Qt 的udpSocket通信
  7. CMM关键过程域剖析:需求管理
  8. linux下文件删除的原理精华讲解(考试题答案系列)
  9. 什么是 XDoclet?
  10. 统计twitter帖子_在Kubernetes上部署InfluxDB和Grafana以收集Twitter统计信息