在锁与监视器中我们对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. Windows Ubuntu Bash申请免费通配符证书(Let's Encrypt)并绑定IIS

    什么是 Let’s Encrypt? 部署 HTTPS 网站的时候需要证书,证书由 CA 机构签发,大部分传统 CA 机构签发证书是需要收费的,这不利于推动 HTTPS 协议的使用. Let’s En ...

  2. Github泄露扫描系统

    Github leaked patrol Github leaked patrol为一款github泄露巡航工具: 提供了WEB管理端,后台数据库支持SQLITE3.MYSQL和POSTGRES 双引 ...

  3. frida的用法--Hook Java代码篇

    frida是一款方便并且易用的跨平台Hook工具,使用它不仅可以Hook Java写的应用程序,而且还可以Hook原生的应用程序. 1. 准备 frida分客户端环境和服务端环境.在客户端我们可以编写 ...

  4. 【ODI】| 数据ETL:从零开始使用Oracle ODI完成数据集成(三)

    资料库的创建.体系结构的创建.模型反向工程都已经完成了,下面就是创建以及执行接口来完成工作了. 浏览前两节请点击: [ODI]| 数据ETL:从零开始使用Oracle ODI完成数据集成(一) [OD ...

  5. .NET Core IdentityServer4实战 第一章-入门与API添加客户端凭据

    内容:本文带大家使用IdentityServer4进行对API授权保护的基本策略 作者:zara(张子浩) 欢迎分享,但需在文章鲜明处留下原文地址. 本文将要讲述如何使用IdentityServer4 ...

  6. Android 网络优化,使用 HTTPDNS 优化 DNS,从原理到 OkHttp 集成

    一.前言 谈到优化,首先第一步,肯定是把一个大功能,拆分成一个个细小的环节,再单个拎出来找到可以优化的点,App 的网络优化也是如此. 在 App 访问网络的时候,DNS 解析是网络请求的第一步,默认 ...

  7. ES 14 - (底层原理) Elasticsearch内部如何处理不同type的数据

    目录 1 type的作用 2 type的底层数据结构 3 探究type的存储结构 3.1 创建索引并配置映射 3.2 添加数据 3.3 查看存储结构 4 关于type的最佳实践 1 type的作用 在 ...

  8. 重学前端 --- Promise里的代码为什么比setTimeout先执行?

    首先通过一段代码进入讨论的主题 var r = new Promise(function(resolve, reject){ console.log("a"); resolve() ...

  9. 《阿里巴巴 Java开发手册》读后感

    前言 只有光头才能变强 前一阵子一直在学Redis,结果在黄金段位被虐了,暂时升不了段位了,每天都拿不到首胜(好烦). 趁着学校校运会,合理地给自己放了一个小长假,然后就回家了.回到家才发现当时618 ...

  10. Hystix熔断解决雪崩问题

    1.线程隔离,服务降级(服务的消费方做降级处理) 当服务繁忙时,如果服务出现异常,不是粗暴的直接报错,而是返回一个友好的提示,虽然拒绝了用户的访问,但是会返回一个结果. 这就好比去买鱼,平常超市买鱼会 ...