在锁与监视器中我们对Object中的方法进行了简单介绍
以监视器原理为核心,三个方法:wait,notify、notifyAll,可以完成线程之间的通信
当然,不会像“语言”似的,有多种多样的沟通语句
只有两个关键词:“等待”与“唤醒”
围绕着同一个监视器的等待与唤醒,就可以完成线程之间的协作
之所以这三个方法是Object中的,是因为在Java中,所有的Object都隐含一个内置的锁和与之关联的监视器
 
而对于线程自身的方法sleep、yield、join,则是线程的调度,是以线程为中心的
某个线程休眠一下、某个线程“礼让”一下其他线程,等待某个线程结束,是一种主动式的管控
管控的核心仍旧是“等待”,但是与wait又有不同:
sleep是单纯的等一会儿,并不会释放监视器;
yield是暂时的谦让一下,也有可能会等一会儿,也可能还是会继续执行(就好像我们平时的“客气”,你客气一下说我来买单,并不一定真的能买单成功)
join底层依赖wait,内部通过同步以该线程对象为锁,进行等待,直到线程结束后获得通知(调用线程等待)
 
所以你看,以上的核心仍旧是“等待”与“唤醒”
因为线程通信协作理论本质如此,并不像人与人之间的沟通那般多种多样,线程之间就是那么简单干脆,XXX你赶紧跟上,XXX你等一下,XXX你等YYY结束了你再弄...大抵如此
 
面对多线程引发的数据安全问题,大致分为三类:原子性、可见性、有序性
Java从语言层面上提供synchronized以及volatile关键字进行保障
等待与唤醒的通信方式也是基于同步的,所以wait、notify、notifyAll必须在同步中才能够使用
sleep虽然本质也是等待,但是原理不是监视器,是基于线程的所以sleep不必须在synchronized内,yield更不需要了,只是跟其他线程客气下,具体还是要看CPU脸色
synchronized可以对三大特性予以保障,从而可以保障线程的安全,volatile是轻量级的线程同步工具,一定程度(某些场景)也可以解决线程安全问题
所以可以说,synchronized和volatile提供了解决线程安全问题的一般思路(那就是借助于同步),而对于线程之间的同步则提供了“等待”与“唤醒”机制
同步是“框架”,等待与唤醒是框架内的手段,sleep、yield、join是对于线程的调度
所以,你看,对于多线程编程问题,借助于关键字synchronized、volatile以及“等待”“唤醒”相关方法,在适当的时候也可以对线程间进行单独的调度,就能够很好地解决
但是多线程编程就这么简单么?
当然不是,这只是Java多线程编程解决方案中的最为核心的部分之一,是整个Java并发解决方案很小,但是却很重要的一部分底层建筑
借助于这部分底层建筑或者这部分的核心理念,你可以构建出来更加高大上的并发工具
而且
在实际的项目中我们是不会直接创建线程的,也几乎不使用原始的调度、协作方法的。
 
 
 

java线程通信与协作小结 多线程中篇(十六)的更多相关文章

  1. Java多线程父子线程关系 多线程中篇(六)

    有的时候对于Java多线程,我们会听到“父线程.子线程”的概念. 严格的说,Java中不存在实质上的父子关系 没有方法可以获取一个线程的父线程,也没有方法可以获取一个线程所有的子线程 子线程的消亡与父 ...

  2. 第23章 java线程通信——生产者/消费者模型案例

    第23章 java线程通信--生产者/消费者模型案例 1.案例: package com.rocco; /** * 生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二, ...

  3. InheritableThreadLocal类原理简介使用 父子线程传递数据详解 多线程中篇(十八)

      上一篇文章中对ThreadLocal进行了详尽的介绍,另外还有一个类: InheritableThreadLocal 他是ThreadLocal的子类,那么这个类又有什么作用呢?   测试代码 p ...

  4. “全栈2019”Java多线程第二十六章:同步方法生产者与消费者线程

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  5. Java线程通信

    Java线程通信 螣蛇乘雾,终为土灰. 多个线程协同工作完成某个任务时就会涉及到线程间通信问题.如何使各个线程之间同时执行,顺序执行.交叉执行等. 一.线程同时执行 创建两个线程a和b,两个线程内调用 ...

  6. “全栈2019”Java多线程第十六章:同步synchronized关键字详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  7. 【Java并发专题之三】Java线程互斥、协作原理

    (I)Java线程互斥原理之synchronized原理 从JDK5引入CAS原子操作,但没有对synchronized关键字做优化,而是增加了J.U.C.concurrent,concurrent包 ...

  8. Java 线程通信

    线程通信用来保证线程协调运行,一般在做线程同步的时候才需要考虑线程通信的问题. 1.传统的线程通信 通常利用Objeclt类提供的三个方法: wait() 导致当前线程等待,并释放该同步监视器的锁定, ...

  9. Java线程通信-生产者消费者问题

    线程通信示例——生产者消费者问题 这类问题描述了一种情况,假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中的产品取走消费.假设仓库中没有产品,则生产者可以将 产品放入仓库,有 ...

随机推荐

  1. mac升级后idea提示Can't start git

    试了官网的解决方案,还是不行,然后到Stack Overflow上面,找到了下面这个方法,完美解决. 在命令行中运行: xcode-select --install 安装软件就可以了.

  2. BZOJ_4002_[JLOI2015]有意义的字符串_矩阵乘法

    BZOJ_4002_[JLOI2015]有意义的字符串_矩阵乘法 Description B 君有两个好朋友,他们叫宁宁和冉冉.有一天,冉冉遇到了一个有趣的题目:输入 b;d;n,求 Input 一行 ...

  3. nginx+php安装

    1.环境概述 虚拟机系统:CentOS Linux release 7.3.1611 (Core) 宿主机系统:Mac Sierra version 10.12.3 nginx:1.10.3 php: ...

  4. 死磕 java集合之DelayQueue源码分析

    问题 (1)DelayQueue是阻塞队列吗? (2)DelayQueue的实现方式? (3)DelayQueue主要用于什么场景? 简介 DelayQueue是java并发包下的延时阻塞队列,常用于 ...

  5. 国际知名CSS Reset 总结

    NO.01   CSS Tools: Reset CSS 网站:https://meyerweb.com/eric/tools/css/reset/ 优点:老牌,用的人多. /* http://mey ...

  6. Django解决跨域问题

    原理:浏览器的同源策略,其实我们的请求发送过去了,服务器也进行响应了,就是浏览器把响应给阻止响应而已 第一种方法jsonp 因为浏览器不对 <script> 标签里面的src属性进行阻止, ...

  7. zabbix微信报警信息优化模板

    --------------------------------告警模板1-------------------------------------- 默认标题 告警项目: {TRIGGER.NAME ...

  8. 【重学计算机】操作系统D4章:设备管理

    1. IO的控制方式 演进过程:轮询 --> 中断 --> DMA --> IO通道 经典布局:南北桥 PS:详见<计算机组成原理> 2. IO的实现 软件实现层次:硬件 ...

  9. java游戏开发杂谈 - 事件处理

    大家都知道,游戏需要跟玩家交互,需要接收玩家的鼠标.键盘发出的命令,比如在地图上点击一下,人物就自动寻路走过去:键盘上按下某个键,就弹出一个背包界面. 这些逻辑是怎么处理的呢? 大家先不用深究太详细的 ...

  10. jQuery实现全选、反选和不选功能

    HTML 我们的页面上有一个歌曲列表,列出多行歌曲名称,并匹配复选框供用户选择,并且在列表下方有一排操作按钮. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 <ul id=&q ...