0

0

详解Java中volatile关键字的使用场景及其作用

WBOY

WBOY

发布时间:2024-01-30 10:01:06

|

2366人浏览过

|

来源于php中文网

原创

java中volatile关键字的作用及应用场景详解

Java中volatile关键字的作用及应用场景详解

一、volatile关键字的作用
在Java中,volatile关键字用于标识一个变量在多个线程之间可见,即保证可见性。具体来说,当一个变量被声明为volatile时,任何对该变量的修改都会立即被其他线程所知晓。

二、volatile关键字的应用场景

  1. 状态标志
    volatile关键字适用于一些状态标志的场景,例如一个线程负责启动和停止另外一个线程的执行。下面是一个实例:
public class FlagThread {
    private volatile boolean running = true;
    
    public void setRunning(boolean running) {
        this.running = running;
    }
    
    public void run() {
        while (running) {
            // 执行任务
        }
        // 停止执行
    }
    
    public static void main(String[] args) {
        FlagThread thread = new FlagThread();
        thread.start();
        
        // 模拟运行一段时间后停止执行
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        thread.setRunning(false);
    }
}

在上述代码中,FlagThread类中的running变量被声明为volatile。当主线程将running设置为false后,FlagThread线程立即将其感知到,并停止执行。

时代购物
时代购物

具有分类浏览商品或使用搜索工具查找商品,可按价格、商品分类、关键字搜索商品,可打印订单的详细信息以及电子邮件通知,保存购物车,查看购物车,清空购物车,查看已经提交的订单,会员注册、享受会员价格,会员登录,市场价,会员价和VIP会员价的比较,为朋友订购商品(送礼物的好办法哦), 完整的客户服务中心,新品上架展示区,推荐商品展示区,特价商品展示区,销售排行展示区,关注排行展示区阅读、发表商品评论信息并

下载

立即学习Java免费学习笔记(深入)”;

  1. 单例模式的双重检查锁定
    在一些情况下,我们需要确保多个线程同时访问一个变量时,该变量只被初始化一次。以下是一个使用双重检查锁定实现的单例模式的例子:
public class Singleton {
    private volatile static Singleton instance;
    
    private Singleton() {}
    
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

在上述代码中,instance变量被声明为volatile。这是因为在多线程环境下,如果不使用volatile关键字,由于指令重排序的问题,可能会导致在多个线程同时访问getInstance方法时,返回的instance不是完全初始化完成的对象。

  1. 双线程间的数据共享
    在多线程编程中,volatile关键字还可以用于双线程间的数据共享。以下是一个示例:
public class SharedData {
    private volatile int data;
    
    public int getData() {
        return data;
    }
    
    public void setData(int data) {
        this.data = data;
    }
}

public class Producer implements Runnable {
    private SharedData sharedData;
    
    public Producer(SharedData sharedData) {
        this.sharedData = sharedData;
    }
    
    @Override
    public void run() {
        int value = 0;
        while (true) {
            sharedData.setData(value);
            value++;
        }
    }
}

public class Consumer implements Runnable {
    private SharedData sharedData;
    
    public Consumer(SharedData sharedData) {
        this.sharedData = sharedData;
    }
    
    @Override
    public void run() {
        while (true) {
            int value = sharedData.getData();
            System.out.println(value);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        SharedData sharedData = new SharedData();
        Thread producerThread = new Thread(new Producer(sharedData));
        Thread consumerThread = new Thread(new Consumer(sharedData));
        
        producerThread.start();
        consumerThread.start();
    }
}

在上述代码中,Producer线程不断地向sharedData对象的data变量写入数据,而Consumer线程不断地从data变量中读取数据。由于data变量被声明为volatile,Producer线程对data的写入操作对Consumer线程来说是可见的。

三、总结
volatile关键字在Java多线程编程中具有重要作用,它用于确保变量的可见性。在一些场景下,我们需要保证多个线程之间对变量的修改对其他线程是可见的,这时就可以使用volatile关键字。然而,需要注意的是,volatile关键字只能保证可见性,并不能保证变量的原子性,如果需要保证原子性,可以考虑使用synchronized关键字或Atomic类。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c++中volatile关键字的作用
c++中volatile关键字的作用

本专题整合了c++中volatile关键字的相关内容,阅读专题下面的文章了解更多详细内容。

75

2025.10.23

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

764

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

376

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

30

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

29

2026.01.21

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

103

2026.02.06

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

376

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

30

2026.01.21

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

4

2026.03.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

相关下载

更多

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Node.js 教程
Node.js 教程

共57课时 | 13.1万人学习

CSS3 教程
CSS3 教程

共18课时 | 6.9万人学习

Django 教程
Django 教程

共28课时 | 4.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号