• 面试之内存模型


    .

    2.内存模型中的可见性,原则性,有序性

     原子性(多线程情况下)

    原子性是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。

    用i++来做为举例,需要read,load,use,等等的操作,单个操作是原子性的,但是对应整个操作i++来说是不能保证原子性的,

    b,可见性

    可见性是指当一个线程修改了某一个共享变量的值,其他线程是否能够立即知道这个修改。

    保证可见性的方法:

    1. volatile(让其他线程的工作内存中的数据失效,重新从主存中load)
    2. synchronized(unlock之前,写变量值回主存)
    3. final(一旦初始化完成,其他线程就可见)。

    c,有序性

    从单线程来看,java代码看是有序的,但是java编译器在编译代码的时候,为了提高性能等因素,会考虑进行指令重排,不影响原意的情况下,原有书序被打乱

    指令重排的基本原则:

    • 程序顺序原则:一个线程内保证语义的串行性
    • volatile规则:volatile变量的写,先发生于读
    • 锁规则:解锁(unlock)必然发生在随后的加锁(lock)前
    • 传递性:A指令先于B指令,B指令先于C指令 那么A指令必然先于C指令
    • 线程的start方法先于它的每一个动作
    • 线程的所有操作先于线程的终结(Thread.join())
    • 线程的中断(interrupt())先于被中断线程的代码
    • 对象的构造函数执行结束先于finalize()方法



  • 相关阅读:
    unity 3d 之合并网格和贴图(combine mesh and texture)
    哈希表(散列表)原理详解
    二叉树-你必须要懂!(二叉树相关算法实现-iOS)
    浅谈数据结构-二叉树
    python中的日志操作和发送邮件
    python实现自定义接口
    python 操作excel
    两个redis之间迁移的python实现
    python对redis的连接和操作
    python3导入自定义模块
  • 原文地址:https://www.cnblogs.com/longsanshi/p/14452977.html
Copyright © 2020-2023  润新知