您的位置:首页 > 编程语言 > Java开发

Java高并发程序设计笔记3之内存模型和线程安全

2016-11-12 12:02 495 查看
原子性

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

比如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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  线程安全 内存