美文网首页
java - JMM(Java内存模型介绍)及解决线程同步问题

java - JMM(Java内存模型介绍)及解决线程同步问题

作者: 夹胡碰 | 来源:发表于2021-04-08 15:58 被阅读0次

1. 线程间同步问题

堆空间中的对象是线程共享的,可以理解为存在主内存中,多个java线程操作同一个堆中对象,会产生线程同步问题。
原因是JVM不允许工作线程直接操作主内存,只允许从主内存中将操作数据拷贝到各自线程的工作内存中,工作内存只对当前线程可见,当有多个线程同时修改同一个对象后,最后写入主内存中就会造成结果不一致情况。

2. 如何解决

  1. synchronized
    synchronized使用的是监视器锁(Monitor),本质是依赖于底层的操作系统的Mutex Lock(互斥锁)来实现的。
    互斥锁:用于保护临界区,确保同一时间只有一个线程访问数据。对共享资源的访问,先对互斥量进行加锁,如果互斥量已经上锁,调用线程会阻塞,直到互斥量被解锁。在完成了对共享资源的访问后,要对互斥量进行解锁。

由于Java的线程是映射到操作系统的原生线程之上的,如果要阻塞或唤醒一条线程,都需要操作系统来帮忙完成,这就需要从用户态转换到核心态中,因此状态转换需要耗费很多的处理器时间。所以synchronized是Java语言中的一个重量级操作。在JDK1.6中,虚拟机进行了一些优化,譬如在通知操作系统阻塞线程之前加入一段自旋等待过程,避免频繁地切入到核心态中:

synchronized与java.util.concurrent包中的ReentrantLock相比,由于JDK1.6中加入了针对锁的优化措施(见后面),使得synchronized与ReentrantLock的性能基本持平。ReentrantLock只是提供了synchronized更丰富的功能,而不一定有更优的性能,所以在synchronized能实现需求的情况下,优先考虑使用synchronized来进行同步。

参考

  1. JMM和底层实现原理
  2. Java synchronized原理总结

相关文章

  • Java内存模型&Volatile

    1.Java内存模型 1.1 Java内存模型(JMM) Java线程间的通信由Java内存模型(JMM)控制,J...

  • java多线程(六)---Java内存模型

    1 Java内存模型(JMM) Java线程间的通信由Java内存模型(JMM)控制,JMM决定一个线程对共享变量...

  • java - JMM(Java内存模型介绍)及解决线程同步问题

    1. 线程间同步问题 堆空间中的对象是线程共享的,可以理解为存在主内存中,多个java线程操作同一个堆中对象,会产...

  • 初识Java内存模型

    Java内存模型(JMM) JMM规定Java每个线程都有自己的工作内存(Working Memory),线程的工...

  • Akka与Java内存模型

    Java内存模型 在Java 5之前,Java内存模型(JMM)定义是有问题的。当多个线程访问共享内存时很可能得到...

  • java基础知识

    java 内存区域、JMM、JAVA线程模型、硬件内存模型 java内存区域分为共享区域(堆、方法区常量池)、私有...

  • JMM简介

    Java Memory Model(JMM)java内存模型,区别与java内存结构。JMM定义了一套在多线程读写...

  • Java 多线程(二):内存模型与 Synchronized、V

    Java 内存模型 Java 内存模型即 Java Memory Model(JMM),JMM 定义了 Java ...

  • java内存模型(JMM)解刨

    JMM简介 Java的内存模型JMM(Java MemoryModel)JMM主要是为了规定了线程和内存之间的一些...

  • ThreadLocal解析

    什么是ThreadLocal 大家是否了解JMM(java内存模型),它主要是为了解决多线程下的共享内存操作问题,...

网友评论

      本文标题:java - JMM(Java内存模型介绍)及解决线程同步问题

      本文链接:https://www.haomeiwen.com/subject/lplvkltx.html