• 第12章 Java内存模型与线程


    参考《深入理解Java虚拟机》

    一、Java内存模型

    1、Java内存模型

    2、内存间交互操作 

    流程图:

    3、volatile关键字

    两个特性:

    3.1、保证变脸对所有线程的可见性;

    由于volatile变量只能保证可见性,在不符合两条规则的运算场景中,仍然需要通过枷锁来保证原子性。

    ①运算结果并不依赖变量的当前值,或者能够确保只有单一的线程修改变量的值。

    ②变量不需要与其他的状态变量共同参与不变约束。

    3.2、禁止指令重排序优化。

    4、对于long和double型变量的特殊规则

    对于64位的数据类型(long和double),允许虚拟机将没有被volatile修饰的64位数据的读写操作划分为两次32位的操作来进行,即允许虚拟机实现选择可以不保证64位数据类型的load、store、read和write这4个操作的原子性,这点就是所谓的long和double的非原子性协定。

    5、并发编程三种特性

    原子性、可见性和有序性(含义不在赘述)。

    除了volatile之外,Java还有两个关键字能实现可见性,即synchronize和final。

    6、先行发生原则

    程序次序规则、管程锁定规则、volatile变量规则、线程启动规则、线程终止规则、线程中断规则、对象终结规则、传递性。

    二、线程

    1、线程的实现

    实现线程主要有3中方式:使用内核线程实现、使用用户线程实现和使用用户线程加轻量级进程混合实现

    1.1、使用内核线程实现

    内核线程(Kernel-Level Thread,KLT)就是直接由操作系统内核(Kernel,下称内核)支持的线程,这种线程由内核来完成线程切换,内核通过操作调度器(Scheduler)对线程进行调度,并负责将线程任务映射到各个处理器上。每个内核线程可以视为内核的一个分身,这样操作系统就有能力同时处理多件事情,支持多线程的内核就叫做多线程内核(Multi-Thread Kernel)。

    程序一般不会直接去使用内核线程,而是去使用内核线程的一种高级接口--轻量级进程(Light Weight Process,LWP),轻量级进程就是我们通常意义上所讲的线程,由于每个轻量级进程都由一个内核线程支持,因此只有先支持内核线程,才能有轻量级进程。

    1.2、使用用户线程实现

    1.3、使用用户线程加轻量级进程混合实现

    1.4、Java线程的实现

    2、Java线程调度

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

    3、线程状态转换(图片来自JavaGuide)

     

  • 相关阅读:
    Effective C++_笔记_条款00_基本术语
    SVM(三)—Kernels(核函数)
    SVM(支持向量机)(二)—Lagrange Duality(拉格朗日对偶问题)
    Logistic Regression(逻辑回归)(二)—深入理解
    java程序验证用户名密码和验证码登录的小例子
    java连接MySQL数据库并读取内容
    一个简单的模板了解css+div网页布局
    HTML文件中css样式的引用
    慕课笔记利用css进行布局【混合布局练习】
    慕课笔记利用css进行布局【混合布局】
  • 原文地址:https://www.cnblogs.com/wangymd/p/12967143.html
Copyright © 2020-2023  润新知