小鸡炸

导航

多线程并发的问题

一、要想并发程序正确地执行、必须保证:原子性、可见性、有序性

volatile:支持【可见性】、【有序性(避免重排序)】、但无法保证原子性
可见性:程序中的数据是放在主内存中、每个CPU都有自己的高速缓存区、CPU在读取主内存数据时、会把主内存的数据复制到自己的缓存中、用完后再还回去、如果在还回去时、这个变量被其他CPU修改、此时就会出现数据不一致;故需要当一个线程修改变量时、让其他线程也能同时获取更新的值、此时就需要使用volatile
public class TestDemo extends Thread {
	static volatile boolean isboolean=true;
	
	@Override
	public void run() {
		while (isboolean);
		
		System.out.println("线程结束");
	}
	
	public static void main(String[] args) throws Exception{
		new TestDemo().start();
		Thread.sleep(2000);
		isboolean=false;
		
		System.out.println("over");
	}
}
有序性:程序中创建一个对象在内存中分为三个步骤:1、分配空间;2、给空间赋值;3、把引用地址赋值给变量;由于CPU运行速度非常快,可能执行的顺序是 123、亦可能是 132、如果第一个CPU执行的顺序是123、另一个CPU执行的顺序是132、此时创建的对象就可能出现错误、故需要给变量添加volatile关键字、让其创建过程需要一致!

二、Synchronized、Lock、Cas:支持原子性

posted on 2022-01-19 11:08  小鸡炸  阅读(38)  评论(0编辑  收藏  举报