一、原子性、可见性与有序性
1.原子性
原子性操作包括read、load、asign、use、store和write
更大范围的原子性保证:lock和unlock(俩者未开放),monitorenter和monitorexit(隐式的使用synchronized)
2.可见性
变量修改后将新值同步回主内存
volatile、synchronize、final都能保证
3.有序性
有序性—串行
无序性—-并行,重排序
volitile和synchronized保证线程之间操作的有序性
备注:使用volatile的前提条件
a.运算结果并不依赖变量的当前值,或者能够确保只有单一的线程修改变量的值
b.变量不需要与其他的状态变量共同参与不变约束
二、先行发生原则
先行发生就是一种偏序关系
程序次序规则:一个线程内 控制流顺序,书写在前面的操作先行发生在书写后面的操作。
管程锁定规则:一个unlock操作先行发生于后面对同一个锁的lock操作,必须强调的是同一个锁,而后面是指时间上的先后顺序
volatile变量规则:对一个volatile变量的写操作先行与这个变量的读操作
线程启动规则:Thread对象的start()方法先行发生于此线程的每一个动作
线程终止规则:线程中的所有操作都先行发生于对此线程的终止检测,可以通过Thread.join()方法结束,Thread.isAlive()的返回值检测线程已经终止执行
线程中断规则:对线程interrupt()方法的调用先行发生于被中断线程的代码检测中断事件的发生,可以通过Thread.interrupted()方法检测到是否有中断发生
对象终结规则:一个对象的初始化完成先行于他的finalize()方法的开始
传递性:如果操作A先行于操作B,操作B先行于操作C,那操作A先行于操作C
三、java与线程
1.线程的实现方式
线程是是CUP调度的基本单位
在java API中,一个Native方法往往意味着这个方法没有使用或者无法使用平台无关的手段来实现
方式一:内核线程
直接由操作系统内核支持的线程,这种线程由内核完成线程切换,内核通过操纵调度器对线程进行调度,并负责将线程的任务映射到各个处理器上。
轻量级进程与内核1:1关系
方式二:用户线程
广义上讲:一个线程不是内核线程就是用户线程
狭义上讲:指完全建立在用户空间的线程库上
进程与用户线程1:N关系
方式三:用户线程加轻量级进程混合实现
进程与线程N:M关系
2.java线程实现
一对一的线程模型实现
3.线程的调度
调度方式:协同式线程调度和抢占式线程调度
java使用抢占式线程调度
线程的优先级,但是不靠谱,因为没有和系统的线程优先级一一对应
4.线程转换
新建、运行、等待、阻塞、结束