程序员潇然 发表于 2022-7-17 22:28:55

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

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

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

而且

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

!(data/attachment/forum/202206/16/141330jha7st9soow8772i.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "common_log.png")
`转载务必注明出处:程序员潇然,疯狂的字节X,https://crazybytex.com/thread-77-1-1.html `
页: [1]
查看完整版本: java线程通信与协作小结 多线程中篇(十六)