iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >利用java如何在高并发使用volatile
  • 262
分享到

利用java如何在高并发使用volatile

java高并发volatile 2023-05-31 16:05:31 262人浏览 薄情痞子
摘要

利用java如何在高并发使用volatile?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。java 高并发中volatile的实现原理摘要: 在多线程并发编程中synchr

利用java如何在高并发使用volatile?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

java 高并发中volatile的实现原理

摘要: 在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。它在某些情况下比synchronized的开销更小

1. 定义:

java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排他单独获得这个变量。Java语言提供了volatile,在某些情况下比锁更加方便。如果一个字段被声明成volatile,java线程内存模型确保所有线程看到这个变量的值是一致的

2. volatile实现原理

那么Volatile是如何来保证可见性的呢?在x86处理器下通过工具获取JIT编译器生成的汇编指令来看看对Volatile进行写操作CPU会做什么事情。

Java代码: instance = new Singleton();//instance是volatile变量

汇编代码: 0x01a3De1d: movb $0x0,0x1104800(%esi);0x01a3de24: lock addl $0x0,(%esp);

有volatile变量修饰的共享变量进行写操作的时候会多第二行汇编代码,通过查IA-32架构软件开发者手册可知,lock前缀的指令在多核处理器下会引发了两件事情。

将当前处理器缓存行的数据会写回到系统内存。

这个写回内存的操作会引起在其他CPU里缓存了该内存地址的数据无效。

处理器为了提高处理速度,不直接和内存进行通讯,而是先将系统内存的数据读到内部缓存(L1,L2或其他)后再进行操作,但操作完之后不知道何时会写到内存,如果对声明了Volatile变量进行写操作,JVM就会向处理器发送一条Lock前缀的指令,将这个变量所在缓存行的数据写回到系统内存。但是就算写回到内存,如果其他处理器缓存的值还是旧的,再执行计算操作就会有问题,所以在多处理器下,为了保证各个处理器的缓存是一致的,就会实现缓存一致性协议,每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了,当处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器的缓存行设置成无效状态,当处理器要对这个数据进行修改操作的时候,会强制重新从系统内存里把数据读到处理器缓存里。

Lock前缀指令会引起处理器缓存回写到内存。Lock前缀指令导致在执行指令期间,声言处理器的 LOCK# 信号。在多处理器环境中,LOCK# 信号确保在声言该信号期间,处理器可以独占使用任何共享内存。(因为它会锁住总线,导致其他CPU不能访问总线,不能访问总线就意味着不能访问系统内存),但是在最近的处理器里,LOCK#信号一般不锁总线,而是锁缓存,毕竟锁总线开销比较大。在8.1.4章节有详细说明锁定操作对处理器缓存的影响,对于Intel486和Pentium处理器,在锁操作时,总是在总线上声言LOCK#信号。但在P6和最近的处理器中,如果访问的内存区域已经缓存在处理器内部,则不会声言LOCK#信号。相反地,它会锁定这块内存区域的缓存并回写到内存,并使用缓存一致性机制来确保修改的原子性,此操作被称为“缓存锁定”,缓存一致性机制会阻止同时修改被两个以上处理器缓存的内存区域数据。

一个处理器的缓存回写到内存会导致其他处理器的缓存无效。IA-32处理器和Intel 64处理器使用MESI(修改,独占,共享,无效)控制协议去维护内部缓存和其他处理器缓存的一致性。在多核处理器系统中进行操作的时候,IA-32 和Intel 64处理器能嗅探其他处理器访问系统内存和它们的内部缓存。它们使用嗅探技术保证它的内部缓存,系统内存和其他处理器的缓存的数据在总线上保持一致。例如在Pentium和P6 family处理器中,如果通过嗅探一个处理器来检测其他处理器打算写内存地址,而这个地址当前处理共享状态,那么正在嗅探的处理器将无效它的缓存行,在下次访问相同内存地址时,强制执行缓存行填充

关于利用java如何在高并发使用volatile问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网精选频道了解更多相关知识。

--结束END--

本文标题: 利用java如何在高并发使用volatile

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

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

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

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

下载Word文档
猜你喜欢
  • 利用java如何在高并发使用volatile
    利用java如何在高并发使用volatile?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。java 高并发中volatile的实现原理摘要: 在多线程并发编程中synchr...
    99+
    2023-05-31
    java 高并发 volatile
  • 如何使用Java高并发编程CyclicBarrier
    本篇内容介绍了“如何使用Java高并发编程CyclicBarrier”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是CyclicBarr...
    99+
    2023-06-15
  • 如何使用Java高并发编程之Semaphore
    本篇内容主要讲解“如何使用Java高并发编程之Semaphore”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用Java高并发编程之Semaphore”吧!共享锁、独占锁学习semapho...
    99+
    2023-06-15
  • 如何在Java中利用CyclicBarrier实现并发编程
    如何在Java中利用CyclicBarrier实现并发编程?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。  使用JAVA编写并发程序的时候,我们需要仔...
    99+
    2023-05-31
    java 并发编程 cyclicbarrier
  • 开发技术:如何利用Java和Unix实现高效并发开发?
    Java和Unix是两个广泛应用于软件开发领域的技术。Java语言具有跨平台、面向对象、安全可靠等特性,Unix操作系统则以稳定性、可靠性和安全性著称。如何将Java和Unix结合起来,实现高效并发开发呢?本文将为您介绍相关技术和实现方法。...
    99+
    2023-09-11
    unix 并发 开发技术
  • 如何使用 Java 和 Bash 实现高效并发?
    随着计算机技术的不断发展,我们需要处理的数据量越来越大,对并发处理的需求也越来越迫切。Java 和 Bash 是常用的编程语言,在处理并发任务方面都有很好的支持。本文将介绍如何使用 Java 和 Bash 实现高效并发。 Java 实现并...
    99+
    2023-10-12
    bash 并发 日志
  • Java如何使用JMeter进行高并发测试
    这篇文章主要介绍了Java如何使用JMeter进行高并发测试,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。软件的压力测试是一种保证软件质量的行为.在金融,电商等领域应用比较普...
    99+
    2023-06-25
  • 怎么在java中使用volatile
    本篇文章为大家展示了怎么在java中使用volatile,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式系统和...
    99+
    2023-06-14
  • go并发利器sync.Once如何使用
    这篇文章主要介绍了go并发利器sync.Once如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇go并发利器sync.Once如何使用文章都会有所收获,下面我们一起来看看吧。1. 简介本文主要介绍 Go ...
    99+
    2023-07-05
  • java并发ThreadPoolExecutor如何使用
    这篇文章主要介绍“java并发ThreadPoolExecutor如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“java并发ThreadPoolExecutor如何使用”文章能帮助大家解决问...
    99+
    2023-07-05
  • 如何在Java中使用容器实现高效的并发操作?
    Java作为一种流行的编程语言,其在并发编程方面的支持非常强大。其中,容器的使用是实现高效并发操作的关键之一。本文将介绍如何在Java中使用容器实现高效的并发操作。 一、什么是容器? 在Java中,容器是一种用于存储和管理对象的数据结构。它...
    99+
    2023-06-21
    容器 并发 数据类型
  • Java高并发编程基础之如何使用AQS
    本篇内容主要讲解“Java高并发编程基础之如何使用AQS”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java高并发编程基础之如何使用AQS”吧! 引言曾经有一道比较比较经典的面试题“...
    99+
    2023-06-15
  • Golang如何利用Goroutine实现高并发处理?
    go语言中的goroutine是一种轻量级线程,可实现高并发处理。使用 go 关键字创建goroutine,如下所示:go func() {}。优势包括:高吞吐量:goroutine并行...
    99+
    2024-05-10
    高并发 golang go语言
  • 如何使用Redis解决高并发
    这篇文章主要介绍了如何使用Redis解决高并发的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何使用Redis解决高并发文章都会有所收获,下面我们一起来看看吧。NoSQLNot Only SQL的简称。NoSQ...
    99+
    2023-07-05
  • 如何在Java中使用并发容器和线程池来提高程序的并发性?
    Java作为一种高级编程语言,提供了许多并发编程的工具和机制,其中包括并发容器和线程池。使用这些工具可以提高程序的并发性,从而使得程序更加高效。 一、并发容器 Java提供了许多并发容器,这些容器具有线程安全的特性,可以让多个线程同时访问容...
    99+
    2023-09-19
    并发 数组 容器
  • Java并发之BlockingQueue如何使用
    Java中的BlockingQueue是一个线程安全的队列实现,它支持在生产者和消费者之间进行数据交换。以下是BlockingQue...
    99+
    2023-08-12
    Java BlockingQueue
  • Java高并发之CyclicBarrier怎么使用
    这篇文章主要介绍了Java高并发之CyclicBarrier怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java高并发之CyclicBarrier怎么使用文章都会有所收获,下面我们一起来看看吧。Jav...
    99+
    2023-07-05
  • 如何使用Shell命令在Java中实现高效的并发操作?
    Shell命令在Java中实现高效的并发操作是一种非常流行的方法。它可以大大提高程序的性能和效率,尤其是在处理大规模数据时。本文将介绍如何使用Shell命令在Java中实现高效的并发操作,并且通过演示代码来帮助读者更好地理解。 一、Shel...
    99+
    2023-08-28
    numy shell 并发
  • Java和Unix如何结合使用提高并发性能?
    Java和Unix是两种非常流行的编程语言和操作系统,它们都有着非常高的可靠性和灵活性。Java作为一种面向对象的编程语言,被广泛应用于网络应用程序、企业级应用程序和移动应用程序的开发。Unix是一种非常稳定和强大的操作系统,被广泛用于服务...
    99+
    2023-09-11
    unix 并发 开发技术
  • ASP网站如何利用并发来提高性能?
    随着互联网的不断发展,越来越多的企业和个人开始使用ASP网站来展示自己的业务和产品。然而,在用户量增加的情况下,ASP网站的性能往往会受到影响,导致网站响应缓慢、访问速度变慢等问题。而并发技术可以帮助ASP网站提高性能,使其更好地服务于用...
    99+
    2023-09-26
    并发 关键字 索引
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作