- 偏向锁:在无竞争的情况下,只是在Mark Word里存储当前线程指针,CAS操作都不做 。
- 轻量级锁:在没有多线程竞争时,相对重量级锁,减少操作系统互斥量带来的性能消耗 。但是,如果存在锁竞争,除了互斥量本身开销,还额外有CAS操作的开销 。
- 自旋锁:减少不必要的CPU上下文切换 。在轻量级锁升级为重量级锁时,就使用了自旋加锁的方式
- 锁粗化:将多个连续的加锁、解锁操作连接在一起,扩展成一个范围更大的锁 。
- 锁消除:虚拟机即时编译器在运行时,对一些代码上要求同步,但是被检测到不可能存在共享数据竞争的锁进行消除 。
文章插图
图片
- New:线程对象创建之后、但还没有调用start()方法 , 就是这个状态 。
- Runnable:它包括就绪(ready)和运行中(running)两种状态 。如果调用start方法,线程就会进入Runnable状态 。它表示我这个线程可以被执行啦(此时相当于ready状态) , 如果这个线程被调度器分配了CPU时间,那么就可以被执行(此时处于running状态) 。
- Blocked:阻塞的(被同步锁或者IO锁阻塞) 。表示线程阻塞于锁,线程阻塞在进入synchronized关键字修饰的方法或代码块(等待获取锁)时的状态 。比如前面有一个临界区的代码需要执行,那么线程就需要等待,它就会进入这个状态 。它一般是从RUNNABLE状态转化过来的 。如果线程获取到锁,它将变成RUNNABLE状态 。
- WAITING : 永久等待状态,进入该状态的线程需要等待其他线程做出一些特定动作(比如通知) 。处于该状态的线程不会被分配CPU执行时间,它们要等待被显式地唤醒,否则会处于无限期等待的状态 。一般Object.wait 。
- TIMED_WATING: 等待指定的时间重新被唤醒的状态 。有一个计时器在里面计算的 , 最常见就是使用Thread.sleep方法触发 , 触发后,线程就进入了Timed_waiting状态,随后会由计时器触发,再进入Runnable状态 。
- 终止(TERMINATED):表示该线程已经执行完成 。
- CountDownLatch:一个或者多个线程,等待其他多个线程完成某件事情之后才能执行;
- CyclicBarrier:多个线程互相等待,直到到达同一个同步点 , 再继续一起执行 。
文章插图
图片
多线程环境下的伪共享
现代计算机计算模型:
CPU的缓存是以缓存行(cache line)为单位进行缓存的 , 当多个线程修改相互独立的变量 , 而这些变量又处于同一个缓存行时就会影响彼此的性能 。这就是伪共享
文章插图
图片
- CPU执行速度比内存速度快好几个数量级,为了提高执行效率,现代计算机模型演变出CPU、缓存(L1,L2,L3) , 内存的模型 。
- CPU执行运算时,如先从L1缓存查询数据,找不到再去L2缓存找,依次类推,直到在内存获取到数据 。
- 为了避免频繁从内存获取数据,聪明的科学家设计出缓存行,缓存行大小为64字节 。
文章插图
图片
假设数据a、b被加载到同一个缓存行 。
- 当线程1修改了a的值,这时候CPU1就会通知其他CPU核 , 当前缓存行(Cache line)已经失效 。
- 这时候,如果线程2发起修改b , 因为缓存行已经失效了,所以「core2 这时会重新从主内存中读取该 Cache line 数据」 。读完后,因为它要修改b的值,那么CPU2就通知其他CPU核 , 当前缓存行(Cache line)又已经失效 。
推荐阅读
- 深入浅出SSH隧道穿透
- 百度推荐排序技术的思考与实践
- SEO内容页优化及文章页优化,提升网站流量与用户体验的关键技巧
- 无视汪小菲官宣新恋情秀恩爱,大S复出拍广告,身形暴瘦与以往判若两人
- 这5部电影,让你真正感受女性的魅力与坚韧
- 金卡戴珊与四姊妹,全凭她们能干的妈妈,目前红遍整个美国
- 双减政策出台的利与弊,双减政策是由国家出台的吗
- 陈龙与章龄之像普通夫妻一样,也有着烟火气,妻子发文称没嫁错人
- 王菲西藏朝拜引热议,网友质疑其虔诚度与慈善行为
- 曾昭怡晒视频:与干妈何超琼开心合影,和甘比一起比耶拍照!