Java的内存模型和线程模型
1、Java内存模型(JMM)

原子性:synchronized
可见性:synchronized,volatile,final
有序性:synchronized,volatile
synchronized加锁都可以保证
volatile可以保证可见性和有序性(禁止指令重排)
8大happens-before关系,如果操作A先行与操作B发生,则操作A的结果对操作B可见,我理解为happens-before重点说明java语言原生的 “可见性”
- 程序次序原则
在一个线程内部,按照代码的顺序,书写在前面的先行发生与后边的。或者更准确的说是在控制流顺序前面的先行发生与控制流后面的,而不是代码顺序,因为会有分支、跳转、循环等。 - 管程锁定规则
一个unlock操作先行发生于后面对同一个锁的lock操作。这里必须注意的是对同一个锁,后面是指时间上的后面 - volatile变量规则
对一个volatile变量的写操作先行发生与后面对这个变量的读操作,这里的后面是指时间上的先后顺序 - 线程启动规则
Thread对象的start()方法先行发生与该线程的每个动作。当然如果你错误的使用了线程,创建线程后没有执行start方法,而是执行run方法,那此句话是不成立的,但是如果这样其实也不是线程了 - 线程终止规则
线程中的所有操作都先行发生与对此线程的终止检测,可以通过Thread.join()和Thread.isAlive()的返回值等手段检测线程是否已经终止执行 - 线程中断规则
对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生,可以通过Thread.interrupted()方法检测到是否有中断发生。 - 对象终结规则
一个对象的初始化完成先行发生于他的finalize方法的执行,也就是初始化方法先行发生于finalize方法 - 传递性
如果操作A先行发生于操作B,操作B先行发生于操作C,那么操作A先行发生于操作C
2、Java线程模型
HotSpot虚拟机 Java的线程就是对应操作系统的线程(也叫轻量级进程LWP)四循环所致。
一个线程一个时刻只会占用一个CPU,通常我们看到某个CPU 100%,可能就是某个线程

KLT:内核线程 就是我们看到的逻辑CPU个数
现代处理器一般开启超线程,会把实际的内核数化为2倍的逻辑内核
所以通常说4C8核 ,6C12核
LWP核KLT有1:1 1:N M:N关系,通常使用M:N

浙公网安备 33010602011771号