• 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中的线程调度使用的是抢占式
    

  • 相关阅读:
    POST请求
    怎样在ios开发中设置tableview的cell颜色
    error LNK2005 已经在***.obj中定义
    IOS开发之UIView的基本使用
    [置顶] 浅谈Android的资源编译过程
    IOS开发之UIView总结
    鉴别不使用的索引
    浅谈Jquery的使用下篇
    Go如何使用实现继承的组合
    做一个小淘气轮廓--文章和论文专辑
  • 原文地址:https://www.cnblogs.com/canmeng-cn/p/9434091.html
Copyright © 2020-2023  润新知