首页 > 编程语言 >JAVA解决并发问题

JAVA解决并发问题

时间:2022-12-05 17:35:18浏览次数:40  
标签:JAVA synchronized Lock 可见 并发 保证 解决 线程 有序性

解决并发问题   解决可见性,有序性,原子性

  • 原子性 
    Java内存模型只保证了基本读取和赋值是原子性操作,如果要实现更大范围操作的原子性,可以通过synchronized和Lock来实现。由于synchronized和Lock能够保证任一时刻只有一个线程执行该代码块,那么自然就不存在原子性问题了,从而保证了原子性。
  • 可见性

    Java提供了volatile关键字来保证可见性。

    当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。

    而普通的共享变量不能保证可见性,因为普通共享变量被修改之后,什么时候被写入主存是不确定的,当其他线程去读取时,此时内存中可能还是原来的旧值,因此无法保证可见性。

    另外,通过synchronized和Lock也能够保证可见性,synchronized和Lock能保证同一时刻只有一个线程获取锁然后执行同步代码,并且在释放锁之前会将对变量的修改刷新到主存当中。因此可以保证可见性。

  • 有序性
    在Java里面,可以通过volatile关键字来保证一定的“有序性”。另外可以通过synchronized和Lock来保证有序性,很显然,synchronized和Lock保证每个时刻是有一个线程执行同步代码,相当于是让线程顺序执行同步代码,自然就保证了有序性。当然JMM是通过Happens-Before 规则来保证有序性的。


标签:JAVA,synchronized,Lock,可见,并发,保证,解决,线程,有序性
From: https://www.cnblogs.com/keyg/p/16952934.html

相关文章

  • [笔记]java分析内存
    分析内存1.jmap_dump2.下载地址https://www.ej-technologies.com/download/jprofiler/files2.1JVM启动参数-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=D:\heap......
  • 【转载】详解mysql插入数据后返回自增ID的七种方法_java
    引言mysql和oracle插入的时候有一个很大的区别是:oracle支持序列做id;mysql本身有一个列可以做自增长字段。mysql在插入一条数据后,如何能获得到这个自增id的......
  • [C++11与并发编程]5、使用条件变量和互斥锁实现信号量
    使用条件变量和互斥锁实现信号量layout:posttitle:使用条件变量和互斥锁实现信号量categories:cpp_concurrencydescription:C++并发编程简介keywords:c++,并发编......
  • Java学习系列:package-info.java的作用
    场景学习​​spring-kafka​​​开源源码的时候,发现每个目录都有一个​​package-info.java​​文件,查找其用法,并整理出来。环境软件版本spring-boot2.1.8.RELEASEspring-ka......
  • [C++11与并发编程]条件变量在生产者-消费者模型中的使用
    条件变量在生产者-消费者模型中的使用layout:posttitle:条件变量在生产者-消费者模型中的陷阱categories:cpp_concurrencydescription:C++并发编程简介keywords:c+......
  • 【基础知识】——java集合
    一、背景最近在刷力扣算法题的过程中对于java集合的定义及使用想要达到更加精准的程度,于是有了本次的总结二、目标宏观总结:绘制java集合类图微观:写每个集合常用的代码实现......
  • 前端知识之JS(javascirpt)
    目录JS简介JS基础1.注释语法2.引入JS的做种方式3.结束符号变量与常量基本数据类型1.数字类型(Number)2.字符类型(string)3.布尔类型(Boolean)4.null和underfined5.对象(obj......
  • java通过poi导出excel和pdf
    【背景】  由于各户的需求,所以需要增加导出excel这个功能,其实大部分系统都需要这个导出功能的,所以这里也就不详细说明具体导出的背景了O(∩_∩)O~  干完导出exce......
  • java并发数据结构之CopyOnWriteArrayList
    CopyOnWriteArrayList是一个线程安全的List实现,其在对对象进行读操作时,由于对象没有发生改变,因此不需要加锁,反之在对象进行增删等修改操作时,它会先复制一个对象副本,然后对......
  • jdk自带的javaVisualVM检测tomcat
    背景:在项目运行的过程中想了解一下tomcat的执行性能情况,下面以jdk自带的javaVisualVm为例进行配置检测1.在我本地(windows系统)找到jdk中的bin目录,找到jvisualvm.exe双击......