JMM内存模型

Posted erdanyang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JMM内存模型相关的知识,希望对你有一定的参考价值。

一、

上下文切换问题:时间片一般是几十毫秒,任务从保存到再加载的过程就是一次上下文切换,多线程竞争锁时会引起上下文切换,时间片到了会引起上下文切换

减少上下文切换:1、无锁并发线程  2、CAS算法  3、使用最少线程  4、协程

死锁问题:1、尽量避免一个线程同时获得多个锁

     2、尽量避免一个线程在锁内同时占用多个资源  

     3、尝试使用定时锁lock.tryLock(timeout)

     4、对于数据库锁,加锁和解锁必须在同一个数据库连接里

二、JVM的并发机制

1、volatile关键字:

volatile比synchronized执行成本更低,因为他不会引起线程上下文的切换和调度

被volatile修饰的共享变量进行写操作的时候会多出一条以lock为前缀的汇编指令:1、lock指令会引起会引起处理器缓冲回写到内存  2、一个处理器的缓冲回写到内存会引起其它处理器的缓冲失效

volatile关键字的作用:1、保证可见性  2、禁止指令重排序【但这两个功能的底层实现都是lock指令】

2、synchronized关键字

无所状态---->偏向锁状态---->撤销偏向锁状态---->轻量级锁状态---->重量级锁状态

偏向锁的撤销是狠耗时的

偏向锁通过偏向锁的撤销膨胀成轻量级锁·

轻量级锁通过自旋膨胀成重量级锁

3、原子操作的实现原理:

  (1)、总线锁

  (2)、缓冲锁(并不是都支持)

  (3)、CAS就是利用CMPXCHG指令实现的(JAVA所用)

    ①ABA问题

    ②循环时间长开销大

    ③只能保证一个共享变量的原子操作

    ④JVM的synchronized的机制中也用了CAS的锁机制

三、JVM的内存模型

线程之间的通信方式:共享内存和消息传递

堆内存是所有线程共享的

缓冲区和重排序这两个问题

以上是关于JMM内存模型的主要内容,如果未能解决你的问题,请参考以下文章

JMM内存模型

JMM内存模型

Java多线程和并发,JMM(Java内存模型)

java内存模型的JMM简介

JMM内存模型

JUC多线程:JMM内存模型与volatile内存语义