一、要想并发程序正确地执行、必须保证:原子性、可见性、有序性
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:支持原子性
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!