[多线程] java线程通信与协作小结 多线程中篇(十六)

编程语言 编程语言 1707 人阅读 | 0 人回复

在锁与监视器中我们对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并发解决方案很小,但是却很重要的一部分底层建筑

借助于这部分底层建筑或者这部分的核心理念,你可以构建出来更加高大上的并发工具

而且

在实际的项目中我们是不会直接创建线程的,也几乎不使用原始的调度、协作方法的。

common_log.png 转载务必注明出处:程序员潇然,疯狂的字节X,https://crazybytex.com/thread-77-1-1.html

关注下面的标签,发现更多相似文章

文章被以下专栏收录:

    黄小斜学Java

    疯狂的字节X

  • 目前专注于分享Java领域干货,公众号同步更新。原创以及收集整理,把最好的留下。
    包括但不限于JVM、计算机科学、算法、数据库、分布式、Spring全家桶、微服务、高并发、Docker容器、ELK、大数据等相关知识,一起进步,一起成长。
热门推荐
[若依]微服务springcloud版新建增添加一个
[md]若依框架是一个比较出名的后台管理系统,有多个不同版本。
[CXX1300] CMake '3.18.1' was not
[md][CXX1300] CMake '3.18.1' was not found in SDK, PATH, or
海康摄像头接入 wvp-GB28181-pro平台测试验
[md]### 简介 开箱即用的28181协议视频平台 `https://github.c