码迷,mamicode.com
首页 > 其他好文 > 详细

JMM内存模型

时间:2020-02-22 20:01:20      阅读:60      评论:0      收藏:0      [点我收藏+]

标签:syn   使用   指令   指令重排序   撤销   算法   协程   时间片   可见性   

一、

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

减少上下文切换: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内存模型

标签:syn   使用   指令   指令重排序   撤销   算法   协程   时间片   可见性   

原文地址:https://www.cnblogs.com/erdanyang/p/12346767.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!