zoukankan      html  css  js  c++  java
  • 面试之内存模型

    .

    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()方法



  • 相关阅读:
    QSslError 类
    QNetworkRequest 请求类
    QFTP走了以后QNetworkAccessManager出现了
    Android之SQLite总结
    Android之Handler机制
    Android之SeekBar总结(一)
    Android之测试相关知识点
    Android数据储存之SharedPreferences总结
    android studio的常用快捷键
    BitmapFactory.Options详解
  • 原文地址:https://www.cnblogs.com/longsanshi/p/14452977.html
Copyright © 2011-2022 走看看