小鸡炸

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

多线程并发的问题

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

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   小鸡炸  阅读(45)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示