如何利用volatile关键字确保线程间可见性?

2026-06-08 17:42:34 257阅读 0评论 SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计635个文字,预计阅读时间需要3分钟。

本文主要介绍了通过volatile关键字验证线程间可见性的概念。文中通过示例代码简要展示了volatile关键字的作用,对家庭学习或工作具有一定的参考价值。需要的伙伴可参考学习。由于JVM运行程序的特殊性,以下内容仅供参考。

如何利用volatile关键字确保线程间可见性?

这篇文章主要介绍了通过volatile验证线程之间的可见性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

由于JVM运行程序的实体是线程,而每个线程创建时JVM都会为其创建一个工作内存(有些地方称为栈空间),工作内存是每个线程的私有数据区域,而Java内存 模型中规定所有变量都存储在主内存,主内存是共享内存区域,所有线程都可以访问,但线程对变量的操作(读取赋值等)必须在工作内存中进行,首先要将变量从主内存拷贝的自己的工作内存空间,然后对变量进行操作,操作完成后再将变量写回主内存,不能直接操作主内存中的变量,各个线程中的工作内存中存储着主内存中的变量副木拷贝,因此不同的线程间无法访问对方的工作内存,线程间的通信(传值)必须通过主内存来完成,其简要访问过程如下图:

如何利用volatile关键字确保线程间可见性?

代码验证如下:

import java.util.concurrent.TimeUnit; class MyData{ //定义初始参数,volatile关键字使用为重点 volatile int number = 0; //更改初始参数 public void changeNumber(){ this.number = 60; } } public class VolatileDemo { public static void main(String[] args) { //初始化资源类 MyData myData = new MyData(); new Thread(() -> { System.out.println(Thread.currentThread().getName()+"初始化线程,初始参数为:"+myData.number); //AAA线程暂停三秒后 try{ TimeUnit.SECONDS.sleep(3); }catch(Exception e){ e.printStackTrace(); } //AAA线程更改初始化参数为60 myData.changeNumber(); System.out.println(Thread.currentThread().getName()+"线程更改初始化参数为:"+myData.number); },"AAA").start(); while(myData.number == 0){ //第二个线程是main线程,在number=0时则一直陷入死循环,当number=60时则打印主线程语句。 } System.out.println(Thread.currentThread().getName()+"主线程当前参数:"+myData.number); } }

结果展示:

1.初始参数number未加上volatile:

2.初始参数number加上volatile:

总结:

volatile是JAVA虚拟机提供的轻量级的同步机制,volatile三大特征:保证可见性,不保证原子性,禁止指令重排。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自由互联。

标签: 线程 关键字 见性

本文共计635个文字,预计阅读时间需要3分钟。

本文主要介绍了通过volatile关键字验证线程间可见性的概念。文中通过示例代码简要展示了volatile关键字的作用,对家庭学习或工作具有一定的参考价值。需要的伙伴可参考学习。由于JVM运行程序的特殊性,以下内容仅供参考。

如何利用volatile关键字确保线程间可见性?

这篇文章主要介绍了通过volatile验证线程之间的可见性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

由于JVM运行程序的实体是线程,而每个线程创建时JVM都会为其创建一个工作内存(有些地方称为栈空间),工作内存是每个线程的私有数据区域,而Java内存 模型中规定所有变量都存储在主内存,主内存是共享内存区域,所有线程都可以访问,但线程对变量的操作(读取赋值等)必须在工作内存中进行,首先要将变量从主内存拷贝的自己的工作内存空间,然后对变量进行操作,操作完成后再将变量写回主内存,不能直接操作主内存中的变量,各个线程中的工作内存中存储着主内存中的变量副木拷贝,因此不同的线程间无法访问对方的工作内存,线程间的通信(传值)必须通过主内存来完成,其简要访问过程如下图:

如何利用volatile关键字确保线程间可见性?

代码验证如下:

import java.util.concurrent.TimeUnit; class MyData{ //定义初始参数,volatile关键字使用为重点 volatile int number = 0; //更改初始参数 public void changeNumber(){ this.number = 60; } } public class VolatileDemo { public static void main(String[] args) { //初始化资源类 MyData myData = new MyData(); new Thread(() -> { System.out.println(Thread.currentThread().getName()+"初始化线程,初始参数为:"+myData.number); //AAA线程暂停三秒后 try{ TimeUnit.SECONDS.sleep(3); }catch(Exception e){ e.printStackTrace(); } //AAA线程更改初始化参数为60 myData.changeNumber(); System.out.println(Thread.currentThread().getName()+"线程更改初始化参数为:"+myData.number); },"AAA").start(); while(myData.number == 0){ //第二个线程是main线程,在number=0时则一直陷入死循环,当number=60时则打印主线程语句。 } System.out.println(Thread.currentThread().getName()+"主线程当前参数:"+myData.number); } }

结果展示:

1.初始参数number未加上volatile:

2.初始参数number加上volatile:

总结:

volatile是JAVA虚拟机提供的轻量级的同步机制,volatile三大特征:保证可见性,不保证原子性,禁止指令重排。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自由互联。

标签: 线程 关键字 见性