在锁与监视器中咱们对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并发解决方案很小,可是却很重要的一部分底层建筑
借助于这部分底层建筑或者这部分的核心理念,你能够构建出来更加高大上的并发工具
并且
在实际的项目中咱们是不会直接建立线程的,也几乎不使用原始的调度、协做方法的。