Java高并发程序设计笔记3之内存模型和线程安全
2016-11-12 12:02
495 查看
原子性
原子性是指一个操作是不可中断的,即使是在多个线程一起执行的适合,一个操作一旦开始,就不会被其它线程干扰
比如i++是原子操作吗?由于这个涉及到一个读的过程,还有就是写的过程,所以肯定不是原子的,再比如在Long型在32位不是
原子的,在64位操作系统上是原子的,这个可以自己验证
有序性
在并发时,程序的执行可能就会出现乱序
一条指令的执行是可以分为很多步骤的
– 取指 IF
– 译码和取寄存器操作数 ID
– 执行或者有效地址计算 EX
– 存储器访问 MEM
– 写回 WB
可见性
可见性是指当一个线程修改了某一个共享变量的值,其他线程是否能够立即知道这个修改。
– 编译器优化
– 硬件优化(如写吸收,批操作)
java虚拟机层面的可见性
Happen-Before
程序顺序原则:一个线程内保证语义的串行性 如a=1 c=a+1
volatile规则:volatile变量的写,先发生于读,这保证了volatile变量的可见性
锁规则:解锁(unlock)必然发生在随后的加锁(lock)前
传递性:A先于B,B先于C,那么A必然先于C
线程的start()方法先于它的每一个动作
线程的所有操作先于线程的终结(Thread.join())
线程的中断(interrupt())先于被中断线程的代码
对象的构造函数执行结束先于finalize()方法
线程安全的概念
指某个函数、函数库在多线程环境中被调用时,能够正确地处理各个线程的局部变量,使程序功 能正确完成。
当然可以使用synchronized来保持同步,或者使用lock.lock
原子性是指一个操作是不可中断的,即使是在多个线程一起执行的适合,一个操作一旦开始,就不会被其它线程干扰
比如i++是原子操作吗?由于这个涉及到一个读的过程,还有就是写的过程,所以肯定不是原子的,再比如在Long型在32位不是
原子的,在64位操作系统上是原子的,这个可以自己验证
有序性
在并发时,程序的执行可能就会出现乱序
public class TestExample { int a=0; boolean flag=false; public void writer(){ a=1; flag=true; } public void read(){ if(flag){ int t=a+1; } } }
一条指令的执行是可以分为很多步骤的
– 取指 IF
– 译码和取寄存器操作数 ID
– 执行或者有效地址计算 EX
– 存储器访问 MEM
– 写回 WB
可见性
可见性是指当一个线程修改了某一个共享变量的值,其他线程是否能够立即知道这个修改。
– 编译器优化
– 硬件优化(如写吸收,批操作)
java虚拟机层面的可见性
public class VisibilityClass extends Thread { private boolean stoped; public void run(){ int t=0; while (!stoped){ t++; } System.out.println("finished,t="+t); } public void setStoped(){ stoped=true; } public boolean getStoped(){ return stoped; } public static void main(String args[])throws Exception{ VisibilityClass v1=new VisibilityClass(); v1.start(); Thread.sleep(2000); v1.setStoped(); Thread.sleep(2000); System.out.println("finish"); System.out.println(v1.getStoped()); } }
Happen-Before
程序顺序原则:一个线程内保证语义的串行性 如a=1 c=a+1
volatile规则:volatile变量的写,先发生于读,这保证了volatile变量的可见性
锁规则:解锁(unlock)必然发生在随后的加锁(lock)前
传递性:A先于B,B先于C,那么A必然先于C
线程的start()方法先于它的每一个动作
线程的所有操作先于线程的终结(Thread.join())
线程的中断(interrupt())先于被中断线程的代码
对象的构造函数执行结束先于finalize()方法
线程安全的概念
指某个函数、函数库在多线程环境中被调用时,能够正确地处理各个线程的局部变量,使程序功 能正确完成。
当然可以使用synchronized来保持同步,或者使用lock.lock
相关文章推荐
- java高并发程序设计学习笔记三内存模型线程安全
- Java高并发程序设计笔记--Java的内存模型(JMM)原子性
- 并发编程笔记(三):Java 内存模型(二)
- 深入理解Java虚拟机笔记---内存模型
- java学习笔记之内存模型
- Java高并发程序设计笔记7之并发容器及典型源码分析
- Java高并发程序设计笔记2之并行程序基础
- 聊聊高并发(四)Java对象的表示模型和运行时内存表示
- Java并发编程系列(一):Java并发内存模型
- Java 内存模型 与 高效并发
- Java并发编程:volatile关键字解析(一.内存模型的相关概念)
- Java高并发程序设计笔记6之JDK同步控制
- Java并发之内存模型-JMM
- JAVA并发编程2_线程安全&内存模型
- java 内存模型笔记(一)
- Java知识点总结篇:Java的内存模型、线程安全、进程和线程的区别
- Java并发编程实践笔记之-什么是线程安全
- Java基础复习一之多线程(并发,内存模型)
- (转)Java并发编程之内存模型与volatile关键字解析
- 关于JAVA中的static方法、并发问题以及JAVA运行时内存模型