面试之内存模型

.

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



原文地址:https://www.cnblogs.com/longsanshi/p/14452977.html