iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >volatile和synchronized的区别是什么
  • 290
分享到

volatile和synchronized的区别是什么

2023-06-16 14:06:36 290人浏览 泡泡鱼
摘要

本篇文章给大家分享的是有关volatile和synchronized的区别是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java 内存模型(JMM)CPU 增加了缓存均衡

本篇文章给大家分享的是有关volatile和synchronized的区别是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

Java 内存模型(JMM)

CPU 增加了缓存均衡了与内存的速度差异,这一增加还是好几层。

volatile和synchronized的区别是什么

此时内存的短板不再那么明显,CPU甚喜。但随之却带来很多问题

volatile和synchronized的区别是什么

看上图,每个核都有自己的一级缓存(L1 Cache),有的架构里面还有所有核共用的二级缓存(L2 Cache)。使用缓存之后,当线程要访问共享变量时,如果 L1 中存在该共享变量,就不会再逐级访问直至主内存了。所以,通过这种方式,就补上了访问内存慢的短板

具体来说,线程读/写共享变量的步骤是这样:

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2.  从主内存复制共享变量到自己的工作内存

  3.  在工作内存中对变量进行处理

  4.  处理完后,将变量值更新回主内存

假设现在主内存中有共享变量 X, 其初始值为 0

线程1先访问变量 X, 套用上面的步骤就是这样:

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2.  L1 和 L2 中都没有发现变量 X,直到在主内存中找到

  3.  拷贝变量 X 到 L1 和 L2 中

  4.  在 L1 中将 X 的值修改为1,并逐层写回到主内存中

此时,在线程 1 眼中,X 的值是这样的:

volatile和synchronized的区别是什么

接下来,线程 2 同样按照上面的步骤访问变量 X

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2.     L1 中没有发现变量 X

  3.     L2 中发现了变量X

  4.     从L2中拷贝变量到L1中

  在L1中将X 的值修改为2,并逐层写回到主内存中

此时,线程 2 眼中,X 的值是这样的:

volatile和synchronized的区别是什么

结合刚刚的两次操作,当线程1再访问变量x,我们看看有什么问题:

volatile和synchronized的区别是什么

此刻,如果线程 1 再次将 x=1回写,就会覆盖线程2 x=2 的结果,同样的共享变量,线程拿到的结果却不一样(线程1眼中x=1;线程2眼中x=2),这就是共享变量内存不可见的问题。

怎么补坑呢?今天的两位主角闪亮登场,不过在说明 volatile关键字之前,我们先来说说你最熟悉的 synchronized 关键字

synchronized

遇到线程不安全的问题,习惯性的会想到用 synchronized 关键字来解决问题,暂且先不论该办法是否合理,我们来看 synchronized 关键字是怎么解决上面提到的共享变量内存可见性问题的

  •  【进入】synchronized 块的内存语义是把在 synchronized 块内使用的变量从线程的工作内存中清除,从主内存中读取

  •  【退出】synchronized 块的内存语义事把在 synchronized 块内对共享变量的修改刷新到主内存中

二话不说,无情向下看 volatile

volatile

当一个变量被声明为 volatile 时:

  •  线程在【读取】共享变量时,会先清空本地内存变量值,再从主内存获取最新值

  •  线程在【写入】共享变量时,不会把值缓存在寄存器或其他地方(就是刚刚说的所谓的「工作内存」),而是会把值刷新回主内存

有种换汤不换药的感觉,你看的一点都没错

volatile和synchronized的区别是什么

所以,当使用 synchronized 或 volatile 后,多线程操作共享变量的步骤就变成了这样:

volatile和synchronized的区别是什么

简单点来说就是不再参考 L1 和 L2 中共享变量的值,而是直接访问主内存

来点踏实的,上例子

public class ThreadNotSafeInteger {            private int value;      public int getValue() {          return value;      }      public void setValue(int value) {          this.value = value;      }  }

经过前序分析铺垫,很明显,上面代码中,共享变量 value 存在大大的隐患,尝试对其作出一些改变

先使用 volatile 关键字改造:

public class ThreadSafeInteger {            private volatile int value;      public int getValue() {          return value;      }      public void setValue(int value) {          this.value = value;      }  }

再使用 synchronized 关键字改造

public class ThreadSafeInteger {            private int value;      public synchronized int getValue() {          return value;      }      public synchronized void setValue(int value) {          this.value = value;      }  }

这两个结果是完全相同,在解决【当前】共享变量数据可见性的问题上,二者算是等同的

如果说 synchronized 和 volatile 是完全等同的,那就没必要设计两个关键字了,继续看个例子

@Slf4j  public class VisibilityIssue {      private static final int TOTAL = 10000;  //    即便像下面这样加了 volatile 关键字修饰不会解决问题,因为并没有解决原子性问题      private volatile int count;      public static void main(String[] args) {          VisibilityIssue visibilityIssue = new VisibilityIssue();          Thread thread1 = new Thread(() -> visibilityIssue.add10KCount());          Thread thread2 = new Thread(() -> visibilityIssue.add10KCount());          thread1.start();          thread2.start();          try {              thread1.join();              thread2.join();          } catch (InterruptedException e) {              log.error(e.getMessage());          }          log.info("count 值为:{}", visibilityIssue.count);      }      private void add10KCount(){          int start = 0;          while (start ++ < TOTAL){              this.count ++;          }      }  }

其实就是将上面setValue 简单赋值操作 (this.value = value;)变成了 (this.count ++;)形式,如果你运行代码,你会发现,count的值始终是处于1w和2w之间的

将上面方法再以 synchronized 的形式做改动

@Slf4j  public class VisibilityIssue {      private static final int TOTAL = 10000;      private int count;       //... 同上      private synchronized void add10KCount(){          int start = 0;          while (start ++ < TOTAL){              this.count ++;          }      }  }

再次运行代码,count 结果就是 2w

以上就是volatile和synchronized的区别是什么,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网精选频道。

--结束END--

本文标题: volatile和synchronized的区别是什么

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

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

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

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

下载Word文档
猜你喜欢
  • volatile和synchronized的区别是什么
    本篇文章给大家分享的是有关volatile和synchronized的区别是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java 内存模型(JMM)CPU 增加了缓存均衡...
    99+
    2023-06-16
  • Java中volatile和synchronized区别是什么?
    不懂Java中volatile和synchronized区别是什么??其实想解决这个问题也不难,下面让小编带着大家一起学习怎么去解决,希望大家阅读完这篇文章后大所收获。volatile是变量修饰符,而synchronized则是作用于一段代...
    99+
    2023-05-31
    java volatile synchronized
  • 在java中synchronized和volatile的区别是什么
    java中synchronized和volatile的区别:volatile仅能使用在变量级别,而synchronized则可以使用在变量、方法、和类级别的。synchronized会线程阻塞,volatile不会造成线程阻塞。synchr...
    99+
    2024-04-02
  • java中volatile和synchronized的区别与联系
    java中volatile和synchronized的区别与联系这个可能是最好的对比volatile和synchronized作用的文章了。volatile是一个变量修饰符,而synchronized是一个方法或块的修饰符。所以我们使用这两...
    99+
    2023-05-31
    volatile synchronized ava
  • Java中Lock和Synchronized的区别是什么
    这篇文章主要讲解了“Java中Lock和Synchronized的区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中Lock和Synchronized的区别是什么”吧!1. ...
    99+
    2023-06-30
  • 关于synchronized、volatile、ReentrantLock的区别与对比
    目录并发编程特性volatile特性:作用的地方:synchronized特性作用的地方修饰方法,分为实例方法和静态方法修饰代码块ReentrantLock特性作用的地方做为成员变量...
    99+
    2023-05-16
    java synchronized java volatile java ReentrantLock java 同步
  • synchronized加锁this和class的区别是什么
    本篇内容介绍了“synchronized加锁this和class的区别是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!synchroni...
    99+
    2023-06-21
  • Synchronized 与 ReentrantLock 的区别是什么
    这篇文章将为大家详细讲解有关Synchronized 与 ReentrantLock 的区别是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。可重入性:从名字上理解,ReenTrantLo...
    99+
    2023-06-19
  • 在java中synchronized和ReentrantLock区别是什么
    java中synchronized和ReentrantLock区别:synchronized是关键字,而ReentrantLock是类。ReentrantLock比synchronized更灵活。ReentrantLock可以对获取锁的等待...
    99+
    2024-04-02
  • synchronized和Lock的区别
    一、基础操作的区别 synchronized:在Java中,synchronized是内置的关键字,它能够保证在同一时刻非常多只有一个线程执行该段代码,以实现对共享资源的同步访问。当一个线程进入synchronized声明的同步代码块...
    99+
    2023-10-29
    区别 synchronized Lock
  • 在java中synchronized和Lock有什么区别
    在java中synchronized和Lock的区别:1.lock是接口,而synchronized是关键字2.synchronized无法判断是否获取锁的状态,而Lock可以判断。3.synchronized在发生异常时候会自动释放占有的...
    99+
    2024-04-02
  • Java常用锁synchronized和ReentrantLock的区别
    目录区别1:用法不同synchronized 基础使用ReentrantLock 基础使用区别2:获取锁和释放锁方式不同区别3:锁类型不同区别4:响应中断不同区别5:底层实现不同小结...
    99+
    2024-04-02
  • 浅谈Java中Lock和Synchronized的区别
    目录1. 从功能角度来看2. 从特性来看3. 从性能方面来看1. 从功能角度来看 Lock和Synchronized都是java中去用来解决线程安全问题的一个工具 2. 从特性来看 ...
    99+
    2024-04-02
  • Java中static和volatile关键字的区别
    1. 作用范围不同 static关键字:用于创建类级别的变量或方法,所有类的实例共享同一个static变量的副本。 volatile关键字:用于确保一个变量在多线程环境中的可见性,使所有线程都能看到最新的变量值。 2....
    99+
    2023-10-29
    关键字 区别 Java
  • 浅谈synchronized加锁this和class的区别
    目录synchronized 用法1.加锁 class 共享一个类实例2.加锁 class 创建多个实例3.加锁 this 共享一个类实例4.加锁 this 创建多个类实例总结syn...
    99+
    2024-04-02
  • Synchronized 和 ReentrantLock 的实现原理及区别
    目录前言考点分析知识扩展ReentrantLock 源码分析JDK 1.6 锁优化自适应自旋锁锁升级总结前言 在 JDK 1.5 之前共享对象的协调机制只有 synchro...
    99+
    2024-04-02
  • ./ 和 sh 的区别是什么
    ./ 和 sh 的区别是什么?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。./ 和 sh的使用区别使用“./”执行脚本,对应的xxx.sh脚本必须要有执行权限;使用“sh”...
    99+
    2023-06-09
  • html5和h5的区别是什么
    这期内容当中小编将会给大家带来有关html5和h5的区别是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。html是什么html的全称为超文本标记语言,它是一种标记语言,包含了一系列标签.通过这些标签可...
    99+
    2023-06-06
  • ram和rom的区别是什么
    这篇文章主要介绍“ram和rom的区别是什么”,在日常操作中,相信很多人在ram和rom的区别是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”ram和rom的区别是什么”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-03
  • JavaScript和Python的区别是什么
    JavaScript和Python的区别是什么?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Python VS JavaScript:应用上的差异Python由...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作