.
2.内存模型中的可见性,原则性,有序性
原子性(多线程情况下)
原子性是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。
用i++来做为举例,需要read,load,use,等等的操作,单个操作是原子性的,但是对应整个操作i++来说是不能保证原子性的,
b,可见性
可见性是指当一个线程修改了某一个共享变量的值,其他线程是否能够立即知道这个修改。
保证可见性的方法:
- volatile(让其他线程的工作内存中的数据失效,重新从主存中load)
- synchronized(unlock之前,写变量值回主存)
- final(一旦初始化完成,其他线程就可见)。
c,有序性
从单线程来看,java代码看是有序的,但是java编译器在编译代码的时候,为了提高性能等因素,会考虑进行指令重排,不影响原意的情况下,原有书序被打乱
指令重排的基本原则:
- 程序顺序原则:一个线程内保证语义的串行性
- volatile规则:volatile变量的写,先发生于读
- 锁规则:解锁(unlock)必然发生在随后的加锁(lock)前
- 传递性:A指令先于B指令,B指令先于C指令 那么A指令必然先于C指令
- 线程的start方法先于它的每一个动作
- 线程的所有操作先于线程的终结(Thread.join())
- 线程的中断(interrupt())先于被中断线程的代码
- 对象的构造函数执行结束先于finalize()方法