Java高并发-Java内存模型和线程安全

1、原子性

原子性是指一个操做是不可中断的。即便在多个线程一块儿执行的时候,一个操做一旦开始,就不会被其它线程干扰。java

i++是原子操做吗?
不是,包含3个操做:读i,i=i+1,写i

32位的机子上读取64位的long型也不是原子操做

2、有序性

2.1 举例

在并发时,程序的执行可能会出现乱序git

2.2 步骤

一条指令的执行是能够分为不少步骤的:github

  • 取指IF
  • 译码和取寄存器操做数ID
  • 执行或者有效地址计算EX
  • 存储器访问MEM
  • 写回WB

流水线执行指令shell

分析:安全

指令分解成不一样阶段
假设一条指令消耗一个CPU时钟周期
5我的生产一个产品,5我的同时工做

a=b+c
读b
读c
计算b+c,结果放到a
写a

分析:多线程

进行优化,使气泡尽量的少

分析:并发

调整指令顺序,能够消除气泡

3、可见性

3.1 定义

可见性是批当一个线程修改了某一个共享变量的值,其余线程是否可以当即知道这个修改。app

  • 编译器优化
  • 硬件优化(如写吸取,批操做)
批量操做,把操做进行积累,只把最终结果写入

3.2 Java虚拟机层面的可见性

http://hushi55.github.io/2015/01/05/volatile-assembly函数

public class VisibilityTest extends Thread {
	private boolean stop;

	public void run() {
		int i = 0;
		while (!stop) {
			i++;
		}
		System.out.println("finish loop,i=" + i);
	}

	public void stopIt() {
		stop = true;
	}

	public boolean getStop() {
		return stop;
	}

	public static void main(String[] args) throws Exception {
		VisibilityTest v = new VisibilityTest();
		v.start();

		Thread.sleep(1000);
		v.stopIt();
		Thread.sleep(2000);
		System.out.println("finish main");
		System.out.println(v.getStop());
	}
}

分析:oop

stop变量加volatile就不会有这个问题了

4、Happen-Before

5、线程安全的概念

指某个函数、函数库在多线程环境中被调用时,可以正确地处理各个线程的局部变量 ,使程序功能正确完成。

i++在多线程下访问的状况:

相关文章
相关标签/搜索