广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java Synchronize下的volatile关键字详解
  • 775
分享到

Java Synchronize下的volatile关键字详解

2024-04-02 19:04:59 775人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

简介关键词:Synchronize与volatile Synchronize:无论是对于Synchronize同步方法异或是Synchronize块,本质是对某对象或某类加锁,

简介关键词:Synchronize与volatile

  • Synchronize:无论是对于Synchronize同步方法异或是Synchronize块,本质是对某对象或某类加,让多线程进行队列化的有序地同步执行。
  • volatile:用于修饰变量。在多线程执行过程中,禁止线程从工作内存(缓存)中读取值。

volatile问题抛出:

让我们看到这样一个问题,我们设置一个含有boolean标志位的类Test,以及两个Runable接口实例,分别为MyThread1,MyThread2。
在MyThread1中通过while循环判断flag是否更改,如果更改便结束循环退出。
在MyThread2中改变flag值。
代码如下:
Test:


public class Test {
 boolean flag = true;
}

MyThread1:


public class MyThread1 implements Runnable{

 Test test;

 public MyThread1(Test test){
  this.test = test;
 }

 @Override
 public void run() {

  while (test.flag){

  }

  System.out.println(Thread.currentThread().getName()+" 我已退出");
 }

}

MyThread2:


public class MyThread2 implements Runnable{

 Test test;

 public MyThread2(Test test){
  this.test = test;
 }

 @Override
 public void run() {

  try {
   Thread.sleep(3000);
  } catch (InterruptedException e) {
   e.printStackTrace();
  }

  test.flag = false;

 }
}

main函数:


public static void main(String[] args) {

 Test test = new Test();

 MyThread1 myThread1 = new MyThread1(test);
 MyThread2 myThread2 = new MyThread2(test);

 Thread thread1 = new Thread(myThread1);
 Thread thread2 = new Thread(myThread2);

 thread1.start();
 try {
  Thread.sleep(1000);
 } catch (InterruptedException e) {
  e.printStackTrace();
 }
 thread2.start();

}
  • 按照我们常规的想法,在在Sleep延时之后,Thread2会更改flag的值。而Thread1也会因此退出循环。
  • 但实际上,Thread1并没有因此退出循环。
  • 原因是Thread1并未从内存中读取flag,而是直接从工作内存中读取。所以即便是Thread2已经更新了flag的值,但Thread1工作内存中的flag也并未更新。所以便导致了Thread1陷入死循环。

该图片来自于Java 并发:volatile 关键字解析 

解决方法:

那么如何解决这样的问题呢?
很简单,使用volatile关键字。让线程不得不从主内存中读取flag值。


volatile boolean flag = true;

在我们添加volatile关键字后,Thread1便可以正常退出。

在Synchronize下的volatile:

此时我们已经了解了volatile关键字的作用,那么在我们的volatile关键字中,Synchronize有着怎样的作用呢?

volatile问题抛出:

其实在我们实际使用中,volatile其实也是有一些隐患的。
例如:我们创造10条线程,每条线程都使volatile修饰的int常量增加1000000次。


public class MyThread1 implements Runnable{

 volatile int num = 0;

 @Override
 public void run() {

  for (int i = 0; i < 1000000; i++) {
   num++;
   System.out.println(Thread.currentThread().getName()+" "+num);
  }

 }

 public static void main(String[] args) {

  MyThread1 myThread1 = new MyThread1();

  Thread[] arr = new Thread[10];

  for (int i = 0; i < 10; i++) {
   arr[i] = new Thread(myThread1);
  }

  for (int i = 0; i < 10; i++) {
   arr[i].start();
  }

 }

}

输出结果

分析:

  • 从结果中,我们可以看到,num并没有像我们想象一样达到10000000。
  • 这是因为volatile所修饰的int变量在自加过程中并非原子操作。这也就是说这个自加的过程可以被打断。可以被分解为:获取值,自加,赋值三个步骤。
  • 例如当,num = 0时,Thread1获取了num的值,并赋值为1,但此时在Thread1还未来得及更新线程的时候,Thread的2以及Thread3已经将线程的值更新为2,但Thread1再赋值,num的值又会重新变为1。
  • 所以,我们便需要在自加的过程中添加Synchronize关键字,让线程实现同步。

结论:

在我们使用volatile关键字时,需要注意操作是否为原子操作,以免造成线程不安全

扩展:

其实,对于原子操作,Java已经提供了Atomic原子类来解决。其中涉及了CAS机制,在不使用Synchronize的情况下,通过比较原值与当前值,不但性能高效,并且也能达到线程安全的目的。

到此这篇关于Synchronize下的volatile关键字 的文章就介绍到这了,更多相关Synchronize volatile关键字 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java Synchronize下的volatile关键字详解

本文链接: https://www.lsjlt.com/news/121568.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java Synchronize下的volatile关键字详解
    简介关键词:Synchronize与volatile Synchronize:无论是对于Synchronize同步方法异或是Synchronize块,本质是对某对象或某类加锁,...
    99+
    2022-11-11
  • Java Synchronize下的volatile关键字是什么
    这篇文章主要讲解了“Java Synchronize下的volatile关键字是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java Synchronize下的volatile关键字是...
    99+
    2023-06-13
  • Java关键字volatile详析
    目录一、可见性二、关于指令重排volatile关键字关于先说它的两个作用: 保证变量在内存中对线程的可见性禁用指令重排 每个字都认识,凑在一起就麻了 这两个作用通常很不容易被我们Ja...
    99+
    2022-11-13
  • Java volatile关键字特性讲解下篇
    目录一、概述二、特性详解一、概述 关键字volatile虽然增加了实例变量在多个线程之间的可见性,但它却不具备同步性,那么也就不具备原子性。 二、特性详解 原子性是指一个线程的操作是...
    99+
    2022-12-12
    Java volatile Java volatile关键字
  • 详解Java并发编程之volatile关键字
    目录1、volatile是什么?2、并发编程的三大特性3、什么是指令重排序?4、volatile有什么作用?5、volatile可以保证原子性?6、volatile 和 sy...
    99+
    2022-11-12
  • java中的volatile关键字
    目录1.volatile实现可见性的原理是什么?2.演示volatile的可见性1.volatile实现可见性的原理是什么? 有volatile变量修饰的共享变量进行写操作的时候汇编...
    99+
    2022-11-12
  • Java Volatile关键字如何理解
    Java Volatile关键字如何理解,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。正文在谈 Volatile 之前,我们先回顾下 Java 内存模...
    99+
    2023-06-22
  • Java中Volatile关键字详解及代码示例
    一、基本概念先补充一下概念:Java内存模型中的可见性、原子性和有序性。可见性:可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉。通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情。为了...
    99+
    2023-05-30
    java volatile关键字 ava
  • c++中的volatile和variant关键字详解
    目录一、两个长得有点像的变量二、二者的功能三、应用实例四、总结一、两个长得有点像的变量 对volatile关键字,其实很多人只是能用,知道用到啥处,但其实应用的原理并不知道。在一些多...
    99+
    2022-11-13
  • JAVA并发中VOLATILE关键字的神奇之处详解
    并发编程中的三个概念: 1.原子性 在Java中,对基本数据类型的变量的读取和赋值操作是原子性操作,即这些操作是不可被中断的,要么执行,要么不执行。 2.可见性 对于可见性,Jav...
    99+
    2022-11-12
  • Java中volatile关键字的作用
    目录一、volatile作用二、什么是可见性三、什么是总线锁和缓存锁四、什么是指令重排序一、volatile作用 可以保证多线程环境下共享变量的可见性通过增加内存屏障防止多个指令之间...
    99+
    2022-11-13
  • Java中不可或缺的关键字volatile详析
    目录什么是volatile关键字保证可见性保证有序性变量初始化赋值懒汉式单例 -- 双重校验锁 volatile版隐藏特性无法保证原子性volatile版synchronized版L...
    99+
    2022-12-27
    java关键字volatile作用 java关键字volatile原理 java关键字volatile
  • 多方面解读Java中的volatile关键字
    目录介绍作用保证变量的可见性:禁止指令重排:不能保证原子性可见性、有序性、原子性不会导致线程阻塞使用场景实现原理happens-before局限性和 synchronized 关键字...
    99+
    2023-05-19
    Java volatile volatile作用 volatile关键字
  • Java同步关键字synchronize底层实现原理解析
    目录1 字节码层实现1.1 InterpreterRuntime::monitorenter1.1.1 函数参数 JavaThread *thread1.1.2 函数体 2...
    99+
    2022-11-12
  • Java 关键字 volatile 的理解与正确使用
    概述Java语言中关键字 volatile 被称作轻量级的 synchronized,与synchronized相比,volatile编码相对简单且运行的时的开销较少,但能够正确合理的应用好 volatile 并不是那么的容易,因为它比使用...
    99+
    2023-05-31
    java volatile ava
  • Java中static和volatile关键字的区别
    1. 作用范围不同 static关键字:用于创建类级别的变量或方法,所有类的实例共享同一个static变量的副本。 volatile关键字:用于确保一个变量在多线程环境中的可见性,使所有线程都能看到最新的变量值。 2....
    99+
    2023-10-29
    关键字 区别 Java
  • Java中JMM与volatile关键字的学习
    目录JMMvolatile关键字可见性与原子性测试哪些地方用到过volatile?单例模式的安全问题你知道CAS吗?CAS底层原理CAS缺点ABA问题总结JMM JMM是指Java内...
    99+
    2022-11-12
  • Java volatile关键字的特性是什么
    这篇文章主要讲解了“Java volatile关键字的特性是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java volatile关键字的特性是什么”吧!一、概述v...
    99+
    2023-07-04
  • Java中的volatile关键字有什么用
    本篇内容主要讲解“Java中的volatile关键字有什么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中的volatile关键字有什么用”吧!一、volatile作用可以保证多线程环...
    99+
    2023-06-30
  • java中的volatile关键字怎么使用
    本篇内容介绍了“java中的volatile关键字怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.volatile实现可见性的原理...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作