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

posted @ 2020-07-12 20:36  蓝天随笔  阅读(182)  评论(0编辑  收藏  举报