在锁与监视器中我们对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. JS基础:常用API

    全局属性 typeof() 检测数据类型 parseInt() 从字符串解析一个整数 parseFloat() 从字符串解析一个小数 Number() 强制类型转换为数字 String() 强制类型转 ...

  2. Centos 7 Linux系统修改网卡名称为ethx

    一.Centos7 系统安装完成后更改网卡名称方法 1.查看Centos7系统默认的网卡配置(eno16777736) [root@server ~]# ifconfig eno16777736: f ...

  3. asp.net core系列 52 Identity 其它关注点

    一.登录分析 在使用identity身份验证登录时,在login中调用的方法是: var result = await _signInManager.PasswordSignInAsync(Input ...

  4. SpringCloud学习系列之五-----配置中心(Config)和消息总线(Bus)完美使用版

    前言 在上篇中介绍了SpringCloud Config的使用,本篇则介绍基于SpringCloud(基于SpringBoot2.x,.SpringCloud Finchley版)中的分布式配置中心( ...

  5. C#操作符??,?,?:功能解析

    ??操作符:叫做空合并操作符,它会对左右两个操作数进行判断,如果左边的数不为空,就返回左边的数,否则返回右边的数. ?操作符:语法糖,表示可空类型,可空类型也是值类型,它是包含null值的值类型,可通 ...

  6. 六大设计原则(二)LSP里氏替换原则

    里氏替换原则LSP(Liskov Subsituation Principle) 里氏替换原则定义 所有父类出现的地方可以使用子类替换并不会出现错误或异常,但是反之子类出现的地方不一定能用父类替换. ...

  7. Fundebug支付宝小程序BUG监控插件更新至0.2.0,新增test()方法,报错增加Page数据

    摘要: 0.2.0新增fundebug.test()方法,同时报错增加了Page数据. Fundebug提供专业支付宝小程序BUG监控服务,可以第一时间为您捕获生存环境中小程序的异常.错误或者BUG, ...

  8. java多线程的几种状态

    java线程状态在Thread中定义,源码中能看到有个枚举State,总共定义了六种状态: NEW: 新建状态,线程对象已经创建,但尚未启动 RUNNABLE:就绪状态,可运行状态,调用了线程的sta ...

  9. java多线程 生产者和消费者 lock

    package com.atguigu.thread.lock; import java.util.concurrent.locks.Condition; import java.util.concu ...

  10. SQL Server统计信息偏差影响表联结方式案例浅析

      我们知道数据库中的统计信息的准确性是非常重要的.它会影响执行计划.一直想写一篇关于统计信息影响执行计划的相关博客,但是都卡在如何构造一个合适的例子上,所以一直拖着没有写.巧合,最近在生产环境中遇到 ...