广告
返回顶部
首页 > 资讯 > 精选 >如何理解java 并发中的原子性与可视性
  • 634
分享到

如何理解java 并发中的原子性与可视性

java并发原子性 2023-05-31 10:05:34 634人浏览 安东尼
摘要

如何理解java 并发中的原子性与可视性?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。java 并发中的原子性与可视性实例详解并发其实是一种解耦合的策略,它帮助我们把做什么

如何理解java 并发中的原子性与可视性?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

java 并发中的原子性与可视性实例详解

并发其实是一种解耦合的策略,它帮助我们把做什么(目标)和什么时候做(时机)分开。这样做可以明显改进应用程序的吞吐量(获得更多的CPU调度时间)和结构(程序有多个部分在协同工作)。做过java web开发的人都知道,JAVA WEB中的Servlet程序在Servlet容器的支持下采用单实例多线程的工作模式,Servlet容器为你处理了并发问题。

原子性

原子是世界上的最小单位,具有不可分割性。比如 a=0;(a非long和double类型) 这个操作是不可分割的,那么我们说这个操作时原子操作。再比如:a++; 这个操作实际是a = a + 1;是可分割的,所以他不是一个原子操作。非原子操作都会存在线程安全问题,需要我们使用同步技术(sychronized)来让它变成一个原子操作。一个操作是原子操作,那么我们称它具有原子性。Java的concurrent包下提供了一些原子类,我们可以通过阅读api来了解这些原子类的用法。比如:AtomicInteger、AtomicLong、AtomicReference等。

可见性

可见性,是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的。也就是一个线程修改的结果。另一个线程马上就能看到。比如:用volatile修饰的变量,就会具有可见性。volatile修饰的变量不允许线程内部缓存和重排序,即直接修改内存。所以对其他线程是可见的。但是这里需要注意一个问题,volatile只能让被他修饰内容具有可见性,但不能保证它具有原子性。比如 volatile int a = 0;之后有一个操作 a++;这个变量a具有可见性,但是a++ 依然是一个非原子操作,也就这这个操作同样存在线程安全问题。

他们之间关系

原子性是说一个操作是否可分割。可见性是说操作结果其他线程是否可见。这么看来他们其实没有什么关系。

实例

package com.chu.test.thread;  public class Test {   volatile int a = 1;  volatile boolean ready;    public class PrintA extends Thread{   @Override   public void run() {    while(!ready){     Thread.yield();    }    System.out.println(a);   }  }  public static void main(String[] args) throws InterruptedException {   Test t = new Test();   t.new PrintA().start();   //下面两行如果不加volatile的话,执行的先后顺序是不可预测的。并且下面两行都是原子操作,但是这两行作为一个整体的话就不是一个原子操作。   t.a = 48; //这是一个原子操作,但是其结果不一定具有可见性。加上volatile后就具备了可见性。   t.ready = true;//同理  }  }

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

--结束END--

本文标题: 如何理解java 并发中的原子性与可视性

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

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

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

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

下载Word文档
猜你喜欢
  • 如何理解java 并发中的原子性与可视性
    如何理解java 并发中的原子性与可视性?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。java 并发中的原子性与可视性实例详解并发其实是一种解耦合的策略,它帮助我们把做什么...
    99+
    2023-05-31
    java 并发 原子性
  • 深入理解Java多线程与并发框(第③篇)——Java内存模型与原子性、可见性、有序性
    一、Java内存模型Java Memory Modle,简称 JMM,中文名称 Java内存模型,它是一个抽象的概念,用来描述或者规范访问内存变量的方式。因为各中计算机的操作系统和硬件不同,方式机制也可能不同,Java内存模型用于屏蔽(适配...
    99+
    2023-06-05
  • 【漫画】JAVA并发编程 如何解决原子性问题
    原创声明:本文转载自公众号【胖滚猪学编程】,转载务必注明出处! 在并发编程BUG源头文章中,我们初识了并发编程的三个bug源头:可见性、原子性、有序性。在如何解决可见性和原子性文章中我们大致了解了可见性和有序性的解决思路,今天...
    99+
    2021-07-03
    【漫画】JAVA并发编程 如何解决原子性问题
  • java并发编程关键字volatile保证可见性不保证原子性详解
    目录关于可见性关于指令重排volatile关键字可以说是Java虚拟机提供的最轻量级的同步机制,但对于为什么它只能保证可见性,不保证原子性,它又是如何禁用指令重排的,还有很多同学没彻...
    99+
    2022-11-13
  • Java中的ConcurrentSkipListMap:高性能并发容器的实现原理。
    Java中的ConcurrentSkipListMap:高性能并发容器的实现原理 在Java编程中,容器是一个非常重要的概念,它们可以存储和管理数据集合。随着多线程编程的普及,高性能并发容器也成为了Java编程的一个热门话题。其中,Conc...
    99+
    2023-09-19
    并发 数组 容器
  • 如何理解数据库的并发操作与一致性
    这篇文章主要讲解了“如何理解数据库的并发操作与一致性”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解数据库的并发操作与一致性”吧!作为分布式强一致数据...
    99+
    2022-10-18
  • 怎么理解Java诡异并发中的有序性
    这篇文章主要介绍“怎么理解Java诡异并发中的有序性”,在日常操作中,相信很多人在怎么理解Java诡异并发中的有序性问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解Ja...
    99+
    2022-10-19
  • Tomcat高并发之如何理解道与性能调优
    这篇文章主要介绍“Tomcat高并发之如何理解道与性能调优”,在日常操作中,相信很多人在Tomcat高并发之如何理解道与性能调优问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Tomcat高并发之如何理解道与性...
    99+
    2023-06-16
  • Go语言中的并发存储:如何提高性能和可靠性?
    Go语言是一种高效、可靠、并发的编程语言。在现代应用程序中,数据存储和管理是非常重要的一部分。在本文中,我们将探讨如何使用Go语言的并发存储来提高性能和可靠性。 Go语言并发模型 在Go语言中,我们可以使用goroutines和channe...
    99+
    2023-10-17
    并发 教程 存储
  • 怎么深入理解Java多线程与并发框中的顺序一致性模型
    怎么深入理解Java多线程与并发框中的顺序一致性模型,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、竞态条件(Race Condition)计算的正确性取决于 多个线程 执行...
    99+
    2023-06-05
  • 如何深入理解Java多线程与并发框中的CAS
    如何深入理解Java多线程与并发框中的CAS,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。CAS实现原理CAS 是 CompareAndSwap 的缩写,意思是...
    99+
    2023-06-05
  • 如何深入理解Java多线程与并发框中的并发辅助工具类
    如何深入理解Java多线程与并发框中的并发辅助工具类,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、Exchanger 交换器(两线程间的通信)使用场景:用于 有且仅有两个线...
    99+
    2023-06-05
  • Java和Django的同步处理:如何优化并发性能?
    Java和Django是两个非常流行的编程语言,它们都有着优秀的并发性能。在实际的开发中,我们经常需要处理大量的并发请求。那么如何优化Java和Django的并发性能呢? 一、Java的同步处理 在Java中,我们通常使用synchroni...
    99+
    2023-09-10
    django 同步 并发
  • 探究Java并发编程中的接口与文件:如何提高程序的效率和可扩展性?
    Java作为一种常用的编程语言,其并发编程能力在现代软件开发中起着至关重要的作用。在实际的应用中,我们经常会涉及到接口和文件的操作,这两个方面对程序的效率和可扩展性都有着重要的影响。本文将探究Java并发编程中接口和文件的应用,讨论如何提高...
    99+
    2023-10-16
    并发 接口 文件
  • 如何理解Java 企业级应用的可扩展性
    这篇文章主要介绍“如何理解Java 企业级应用的可扩展性”,在日常操作中,相信很多人在如何理解Java 企业级应用的可扩展性问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解Java 企业级应用的可扩展性...
    99+
    2023-06-17
  • Java语言如何实现实时数据处理和NumPy并发的高并发性能?
    Java语言和NumPy都是在数据处理领域广泛使用的工具,它们都提供了高效的数据处理能力。在实时数据处理和高并发性能方面,Java语言和NumPy的处理方式略有不同。本文将介绍如何使用Java语言和NumPy实现实时数据处理和高并发性能。...
    99+
    2023-09-23
    实时 numy 并发
  • 如何设置苹果手机的阿里云代理并保证其可靠性与安全性
    在当今的数字化时代,越来越多的人选择使用手机来处理工作、学习和生活事务。然而,随着网络环境的复杂性和安全威胁的日益增加,如何设置和使用阿里云代理成为了很多人关心的问题。本文将详细说明如何设置苹果手机的阿里云代理,以及如何保证其可靠性与安全性...
    99+
    2023-11-18
    阿里 可靠性 保证其
  • 如何深入理解Java多线程与并发框中线程的状态
    本篇文章给大家分享的是有关如何深入理解Java多线程与并发框中线程的状态,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1. 新建状态(New)万事万物都不是凭空出现的,线程也一...
    99+
    2023-06-05
  • 如何深入理解Java多线程与并发框中的volatile关键字
    本篇文章为大家展示了如何深入理解Java多线程与并发框中的volatile关键字,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。概念把对 volatile变量的单个读/写,看成是使用 同一个监视器锁 ...
    99+
    2023-06-05
  • 如何理解HTML5中的标准属性与自定义属性
    这篇文章将为大家详细讲解有关如何理解HTML5中的标准属性与自定义属性,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。正如 HTML5 语法中所阐述的,元素可...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作