线程间通信

如果一个线程从头到尾执行完也不和别的线程打交道的话,那就不会有各种安全性问题了。但是协作越来越成为社会发展的大势,一个大任务拆成若干个小任务之后,各个小任务之间可能也需要相互协作最终才能执行完整个大任务。所以各个线程在执行过程中可以相互通信,所谓通信就是指相互交换一些数据或者发送一些控制指令,比如一个线程给另一个暂停执行的线程发送一个恢复执行的指令,下边详细看都有哪些通信方式。

volatile和synchronized

可变共享变量是天然的通信媒介,也就是说一个线程如果想和另一个线程通信的话,可以修改某个在多线程间共享的变量,另一个线程通过读取这个共享变量来获取通信的内容。

由于原子性操作、内存可见性和指令重排序的存在,java提供了volatile和synchronized的同步手段来保证通信内容的正确性,假如没有这些同步手段,一个线程的写入不能被另一个线程立即观测到,那这种通信就是不靠谱的~

wait/notify机制

故事背景

也不知道是那个遭天杀的给我们学校厕所的坑里塞了个塑料瓶,导致楼道里如黄河泛滥一般,臭味熏天。更加悲催的是整个楼只有这么一个厕所,比这个更悲催的是这个厕所里只有一个坑!!!!!好吧,让我们用java来描述一下这个厕所:

public class Washroom {

private volatile boolean isAvailable = false; //表示厕所是否是可用的状态

private Object lock = new Object(); //厕所门的锁

public boolean isAvailable() {

return isAvailable;

}

public void setAvailable(boolean available) {

this.isAvailable = available;

}

public Object getLock() {

return lock;

}

}

isAvailable字段代表厕所是否可用,由于厕所损坏,默认是false的,lock字段代表这个厕所门的锁。需要注意的是 isAvailable字段被volatile修饰,也就是说有一个线程修改了它的值,它可以立即对别的线程可见~

由于厕所资源宝贵,英明的学校领导立即拟定了一个修复任务:

public class RepairTask implements Runnable {

private Washroom washroom;

public RepairTask(Washroom washroom) {

this.washroom = washroom;

}

@Override

public void run() {

synchronized (washroom.getLock()) {

System.out.println("维修工 获取了厕所的锁");

System.out.println("厕所维修中,维修厕所是一件辛苦活,需要很长时间。。。");

try {

Thread.sleep(5000L); //用线程sleep表示维修的过程

} catch (InterruptedException e) {

throw new RuntimeException(e);

}

washroom.setAvailable(true); //维修结束把厕所置为可用状态

System.out.println("维修工把厕所修好了,准备释放锁了");

}

}

}

这个维修计划的内容就是当维修工进入厕所之后,先把门锁上,然后开始维修,维修结束之后把Washroom的isAvailable字段设置为true,以表示厕所可用。

与此同时,一群急得像热锅上的蚂蚁的家伙在厕所门前打转转,他们想做神马不用我明说了吧

java判断线程是否wait_Java并发编程之线程间通讯(上)wait/notify机制相关推荐

  1. java queue 线程安全_java并发编程之线程安全方法

    线程安全的实现方法,包含如下方式 一, 互斥同步 使用互斥锁的方式. 举个栗子 synchronized,最常用的同步实现方案, ReentrantLock,java并发包中工具,后续介绍. 互斥同步 ...

  2. java线程状态_java并发编程之线程状态

    java线程中,线程状态是如何转换的呢?这一次我们一起来学习下. 线程状态: NEW: 线程创建之后,还没有启动.这时候它的状态就是NEW RUNNABLE: 正在Java虚拟机下跑任务的线程的状态. ...

  3. java 线程安全list_JAVA并发编程实战-线程安全性

    线程安全性: 对象的状态是指存储在状态变量(例如实例和静态域)中的数据. 对象的状态可能包括其他依赖对象的域. 例如:某个HashMap的状态不仅存储在HashMap对象本身,还存储在许多Map.En ...

  4. c++ 线程池_JAVA并发编程:线程池ThreadPoolExecutor源码分析

    前面的文章已经详细分析了线程池的工作原理及其基本应用,接下来本文将从底层源码分析一下线程池的执行过程.在看源码的时候,首先带着以下两个问题去仔细阅读.一是线程池如何保证核心线程数不会被销毁,空闲线程数 ...

  5. python3 线程隔离_Python并发编程之线程中的信息隔离(五)

    大家好,并发编程 进入第三篇. 上班第一天,大家应该比较忙吧.小明也是呢,所以今天的内容也很少.只要几分钟就能学完. 昨天我们说,线程与线程之间要通过消息通信来控制程序的执行. 讲完了消息通信,今天就 ...

  6. [转]Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  7. Java并发编程:线程池的使用

    在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统 ...

  8. 【Java 并发编程】线程池机制 ( ThreadPoolExecutor 线程池构造参数分析 | 核心线程数 | 最大线程数 | 非核心线程存活时间 | 任务阻塞队列 )

    文章目录 前言 一.ThreadPoolExecutor 构造参数 二.newCachedThreadPool 参数分析 三.newFixedThreadPool 参数分析 四.newSingleTh ...

  9. 【Java 并发编程】线程池机制 ( 线程池示例 | newCachedThreadPool | newFixedThreadPool | newSingleThreadExecutor )

    文章目录 前言 一.线程池示例 二.newCachedThreadPool 线程池示例 三.newFixedThreadPool 线程池示例 三.newSingleThreadExecutor 线程池 ...

最新文章

  1. UITableView
  2. python零碎知识(8):UserDict 类
  3. 【数据结构与算法】之组成和的完全平方数最少个数的求解思路与算法示例
  4. 使用IntelliJ IDEA 配置Maven
  5. 洛谷-P1903 数颜色 分块 bitset
  6. python 命令行运行 多进程_Python初学——多进程Multiprocessing
  7. 北理珠计算机学院学生会,梦回北理
  8. Observer (观察者) 模式
  9. 医院挂号系统源码(含数据库)
  10. 计算机网络网络适配器的作用是什么原因,Win10网络适配器在哪里对网络有什么影响 网络适配器出现各种故障的解决方法...
  11. 阿里云ECS服务器使用教程
  12. kettle json input组件 Unable to access your JSON data
  13. IOS 公司开发者账号申请详细教程-13810208661
  14. ASO优化:关键词排名下降的原因及策略解析
  15. win10解决没有照片查看器的办法
  16. windows 凭据管理
  17. 第七章 项目成本管理
  18. python操作excel 2016
  19. ACM 海贼王之伟大航路(深搜剪枝)
  20. 如何科学化、系统化的构建行业舆情模型(关键词方案)

热门文章

  1. 阿里文娱首次公开!AI 如何对爆款内容未卜先知?
  2. 看!闲鱼又开源了一个 Flutter 开发利器
  3. 技术架构演进|0到千万DAU,微淘如何走过?
  4. I+关系网络分析发布,提供完整的可视化分析和关系引擎功能
  5. 用aliplayer如何实现视频的连续播放?
  6. 对象存储,为什么那么火?
  7. 微信几亿人在线的点赞、取消点赞系统,用Redis如何实现?
  8. “12306”的架构到底有多6?
  9. 被吹得天花乱坠的无服务器架构,究竟是什么?
  10. 面试鹅厂,我三面被虐的体无完肤……