synchronized内部的工作原理

一、synchronized的策略

synchronized内部优化的非常好,大部分情况下使用 synchronized 不会有什么问题.

1. 乐观锁/悲观锁  自适应

2. 轻量级锁/重量级锁   自适应

3. 自旋锁/挂起等待所   自适应

4. 不是读写锁

5. 非公平锁

6. 可重入锁

二、synchronized背后的优化手段

synchronized加锁过程,尤其是 " 自适应 " 是怎么一回事呢?

synchronized在执行的时候,如果当前对象处于未加锁状态,就会经历以下过程 :

1. 偏向锁  阶段      (   假设没有其他线程和他竞争   )

核心思想 " 懒汉模式 ",能不加锁就不加锁,加锁能晚一点是一点.

所谓的偏向锁,并非是真的加锁了,而是做了一个非常轻的标记.

非必要不加锁

在遇到竞争的时候,偏向锁没有提高效率.

但如果在没有遇到竞争的情况下,偏向锁就大幅度的提高了效率.

总的来说,偏向锁的意义还是很大的.

2. 轻量级锁   阶段   (   假设有竞争但是不多   )

轻量级锁   是通过自旋锁的方式来实现的.

优势 : 别的线程释放锁,就会第一时间拿到锁

劣势 : 消耗CPU     (   如果线程比较多,都在自旋,就会消耗CPU   )

synchronized内部会统计当前这个锁对象上,有多少个线程在竞争,当发现竞争的线程比较多,就会升级为重量级锁.

3. 重量级锁   阶段

此时拿不到锁的线程就不会继续自旋了,而是进入 " 阻塞等待 " ,就不会消耗那么多的CPU,不会使CPU的占用率太高了.

当当前线程释放锁的时候,系统会随机唤醒一个线程来进行获取锁.

锁只能升级,不能降级.

4. 锁消除

锁消除,也是synchronized中内置的优化策略.

编译器优化的一种方式,编译器编译代码的时候,如果发现这个代码,不需要加锁,就会自动把锁给干掉.

比如,就只有一个线程,在这一个线程里,加锁了,

锁消除.针对一眼看上去就知道完全不涉及线程安全问题的代码,能够把锁消除掉.

偏向锁,运行起来才知道有没有锁冲突.

5. 锁粗化

会把多个细粒度的锁,合并成一个粗粒度的锁.

  ps : 

synchronized的  "{}"  中包含的代码越少,就认为锁的粒度越细,包含的代码越多,就认为锁的粒度越粗.

通常情况下,是更偏好于让锁的粒度细一点,更有利于多个线程的并发执行.

但有时候,希望锁的粒度粗一点也挺好.

像这样,一个线程自己在进行加锁解锁加锁解锁,就会把这几次加锁解锁合并为一个粗粒度的锁,这样可以减少几次加锁解锁,提高效率.

6. 小结

synchronized 背后设计到了很多的 " 优化手段"

1. 锁升级.偏向锁, -> 轻量级锁 -> 重量级锁

2. 锁消除.自动干掉不必要的锁

3. 锁粗化.把多个细粒度的锁合并为一个粗粒度的锁,减少锁竞争的开销.

相关推荐

  1. Synchronized关键字底层原理

    2024-05-26 01:38:42       40 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-26 01:38:42       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-26 01:38:42       100 阅读
  3. 在Django里面运行非项目文件

    2024-05-26 01:38:42       82 阅读
  4. Python语言-面向对象

    2024-05-26 01:38:42       91 阅读

热门阅读

  1. 001 mongodb

    2024-05-26 01:38:42       33 阅读
  2. QT--splitter的使用

    2024-05-26 01:38:42       37 阅读
  3. 39. 组合总和 - 力扣(LeetCode)

    2024-05-26 01:38:42       31 阅读
  4. 169. 多数元素

    2024-05-26 01:38:42       35 阅读
  5. 15、Go Gin常见响应返回详解

    2024-05-26 01:38:42       37 阅读
  6. 掌握C++回调:按值捕获、按引用捕获与弱引用

    2024-05-26 01:38:42       35 阅读
  7. 【数据结构与算法 | 基础篇】数组模拟栈

    2024-05-26 01:38:42       36 阅读
  8. 银发经济:老龄化社会中的机遇与挑战

    2024-05-26 01:38:42       36 阅读
  9. 基于Amazon Cognito的安全登录与资源访问

    2024-05-26 01:38:42       28 阅读