标签: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的内存模型
线程之间的通信方式:共享内存和消息传递
堆内存是所有线程共享的
缓冲区和重排序这两个问题
标签:syn 使用 指令 指令重排序 撤销 算法 协程 时间片 可见性
原文地址:https://www.cnblogs.com/erdanyang/p/12346767.html