Java内存模型

volatile变量

当一个变量被定义为volatile类型之后,它具备两个特性:
1、可见性,所有对该变量上作的更改,其他线程可以立刻知道。volatile变量在各工作线程中不存在一致性问题。

2、禁止指令重排序

long、double型变量的特殊规则

Java内存模型要求lock、unlock、read、load、assign、use、store、write这8个操作具有原子性,但是对于64位的数据类型long和double,允许虚拟机在没有volatile修饰的时候不保证long和double写入的原子性
如果有多个线程共享一个并未声明为volatile的long或double类型的变量,并且同时对它们进行读取和修改操作,那么某些线程可能会读取到一个既非原值,也不是其他线程修改值的代表了“半个变量”的数值

happens-before原则

1、程序次序规则:在一个线程内,书写在前面的操作先行发生于书写在后面的操作
2、管程锁定规则:一个unlock操作先行发生于对同一个锁的lock。也就是同一个锁只有先被释放之后才能够被获取
3、volatile变量规则(Volatile Variable Rule):对一个volatile变量的写操作先行发生于后面对这个变量的读操作,这里的“后面”同样是指时间上的先后顺序(不太理解)
4、线程启动规则:一个线程对象的start方法先行发生于此线程的每一个动作
5、线程终止规则:线程中的所有操作都先行发生于对此线程的终止检测
6、线程中断规则:对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生(不理解)
7、对象终结规则:一个对象的初始化先行发生于该对象的finalize()方法的开始
8、传递性规则:如果操作A先行发生于操作B,操作B先行发生于操作C,则操作A先行发生于操作C

Java线程的调度

线程调度是指系统为线程分配处理器使用权的过程,主要调度方式分为协同式线程调度和抢占式线程调度两种

协同式线程调度:线程执行时间由线程本身来控制,线程把自己的工作执行完成之后,主动通知系统切换到另一个线程上。
    该调度方式存在的问题:如果当前线程阻塞并且坚持不让出cpu,将可能导致系统崩溃,不存在线程竞争问题

抢占式线程调度:每个线程由系统来分配执行时间,线程切换不是由线程本身决定,而是由系统来决定。相对协调式线程调度方案,该方案可控,不会因为个别线程的阻塞而导致整个系统崩溃

Java中的线程调度使用的是抢占式

原文地址:https://www.cnblogs.com/canmeng-cn/p/9434091.html