zoukankan      html  css  js  c++  java
  • 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中的线程调度使用的是抢占式
    

  • 相关阅读:
    LeetCode 1110. Delete Nodes And Return Forest
    LeetCode 473. Matchsticks to Square
    LeetCode 886. Possible Bipartition
    LeetCode 737. Sentence Similarity II
    LeetCode 734. Sentence Similarity
    LeetCode 491. Increasing Subsequences
    LeetCode 1020. Number of Enclaves
    LeetCode 531. Lonely Pixel I
    LeetCode 1091. Shortest Path in Binary Matrix
    LeetCode 590. N-ary Tree Postorder Traversal
  • 原文地址:https://www.cnblogs.com/canmeng-cn/p/9434091.html
Copyright © 2011-2022 走看看