锁策略, cas 和 synchronized 优化过程

ops/2024/9/24 8:09:40/

1.1 常見的鎖策略
  1. 預測鎖衝突概率

  • 樂觀鎖:加鎖的時候,假設出現鎖衝突的概率不大。圍繞加鎖做的工作會更少。

  • 悲觀鎖:加鎖的時候,假設鎖出現衝突的概率很大。圍繞加鎖做的工作會更多。

  • synchronized “自適應” 初始是樂觀的。鎖衝突達到一定程度就會轉變爲悲觀的。

  1. 加鎖開銷(時間開銷)

  • 重量級鎖

  • 輕量級鎖

  • 挂起等待鎖:悲觀鎖/重量級鎖的一種典型實現。讓出cpu資源,過一段時間通過其他途徑得知,再伺機而動。

  • 自旋鎖:樂觀鎖/輕量級鎖的一種典型實現。忙等,等待過程中不釋放cpu資源,反復檢測鎖是否被釋放。一旦釋放立即有機會獲取到鎖。

  • 公平鎖:先來後到

  • 非公平鎖:synchronized ,剩下的都公平競爭

  • 可重入鎖 1)記錄當前是哪個綫程使用這個鎖 2)在加鎖是判定,申請當時鎖的綫程是否就是鎖的持有者綫程 3)計數器,記錄加鎖次數,從而確定何時真正釋放鎖

  • 不可重入鎖

  • 死鎖問題:針對一把鎖連續兩次加鎖就可能出現死鎖,可以把鎖設置成“可重入鎖”

  1. 讀寫鎖

  • synchronized并非是讀寫鎖

  • 把加鎖操作分爲“讀加鎖”和”寫加鎖“,提供了兩種加鎖api,解鎖的api相同。

  • 如果,多个线程,同时读这个变量,没有线程安全问题。但是,一个线程读/一个线程写或者两个线程都写就会产生问题,

  • 如果两个线程,都是按照读方式加锁,此时不会产生锁冲突。如果两个线程,都是加写锁,此时会产生锁冲突。如果一个线程读锁,一个是写锁,也会产生锁冲突。

  • 系統内置鎖,可重入讀寫鎖ReentrantReadWriteLock。内部類ReentrantReadwriteLock.ReadLock/ReentrantReadWriteLock.WriteLock。lock/unlock方法。

1.2 synchronized原理
  • 乐观悲观自适应

  • 重量轻量,自适应

  • 自旋挂起等待,自适应

  • 非公平锁

  • 可重入锁

  • 不是读写锁

  • 鎖升級:刚开始使用synchronized加锁,首先锁会处于“偏向锁”状态。遇到线程之间的锁竞争,升级到“轻量级锁“。进一步的统计竞争出现的频次,达到一定程度之后,升级到“重量級锁”。

  • synchronized加锁的时候,会经历无锁=>偏向锁=>轻量级锁=>重量级锁。出現競爭/競爭激烈。鎖升級對當前jvm來説不可逆。

  • 偏向鎖不是真鎖,只是做個標記,比較輕量高效。

  • 鎖消除。(編譯器優化策略)

  • 鎖粗化。(編譯器優化策略)。鎖的粒度。synchronized{}裏代碼越多,粒度越粗。把多個”細粒度“的鎖合并成”粗粒度“的鎖。

1.3 CAS
  • compare and swap

  • 比较内存和cpu寄存器中的内容.如果发现相同,就进行交换(交换的是内存和另一个寄存器的内容)

  • 比较内存和寄存器1中的值,是否相等如果不相等,就无事发生。如果相等,就交换内存和寄存器2的值

  • 此处一般只是关心,内存交换后的内容。不关心寄存器2交换后的内容。相當於”賦值“

  • 一個cpu指令就能完成。可以寫”無鎖化編程“。

  • 使用場景:

    • 基於CAS實現”原子類“。對int/long等類型進行封裝,從而可以原子地完成++等操作。標準庫裏也有。

      java">package thread;
      ​
      import java.util.concurrent.atomic.AtomicInteger;
      ​
      public class Demo34 {// private static int count = 0;private static AtomicInteger count = new AtomicInteger(0);
      ​public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() -> {for (int i = 0; i < 50000; i++) {count.getAndIncrement();  // count++
      //                count.incrementAndGet();  // ++count
      //                count.getAndDecrement();  // count--
      //                count.decrementAndGet();  // --count
      //                count.getAndAdd(10);        // count+= 10}});Thread t2 = new Thread(() -> {for (int i = 0; i < 50000; i++) {// count++;count.getAndIncrement();}});t1.start();t2.start();t1.join();t2.join();
      ​// 通过 count.get() 拿到原子类内部持有的真实数据.System.out.println("count = " + count.get());}
      }


http://www.ppmy.cn/ops/115198.html

相关文章

WordPress建站钩子函数及使用

目录 前言&#xff1a; 使用场景&#xff1a; 一、常用的wordpress钩子&#xff08;动作钩子、过滤器钩子&#xff09; 1、动作钩子&#xff08;Action Hooks&#xff09; 2、过滤器钩子&#xff08;Filter Hooks&#xff09; 二、常用钩子示例 1、添加自定义 CSS 和 JS…

解决Vue 3中Element Plus el-color-picker 组件消失的问题

概述 在使用Vue 3和Element Plus框架构建应用程序时&#xff0c;你可能会遇到el-color-picker组件无法正常显示的情况。这可能是由于多种原因造成的&#xff0c;包括但不限于CSS加载问题、JavaScript错误、版本兼容性等。本文将指导你如何排查并解决这个问题。 在 el-color-p…

Java之String 类的学习

目录 1. String类的重要性 2. 常用方法 2.1 字符串常用3种构造 2.2 String对象的4种比较 1. 比较是否引用同一个对象 2. boolean equals(Object anObject) 方法&#xff1a;按照字典序比较 3. int compareTo(String s) 方法: 按照字典序进行比较 4. int compar…

Blender软件三大渲染器Eevee、Cycles、Workbench对比解析

Blender 是一款强大的开源3D制作平台&#xff0c;提供了从建模、雕刻、动画到渲染、后期制作的一整套工具&#xff0c;广泛应用于电影、游戏、建筑、艺术等领域。 渲染101云渲染云渲6666 相比于其他平台&#xff0c;如 Autodesk Maya、3ds Max 或 Cinema 4D&#xff0c;Blende…

平衡二叉树(AVL树):原理、常见算法及其应用

目录 引言 AVL树的基本概念 常见算法 插入节点 查找节点 删除节点 AVL树的应用场景 1. 数据库索引 2. 符号表 3. 字典和词汇表 4. 动态集合 5. GPS导航系统 6. 计算机辅助设计&#xff08;CAD&#xff09; 结论 引言 平衡二叉树&#xff08;Balanced Binary Tre…

解决启动docker desktop报The network name cannot be found的问题

现象 deploying WSL2 distributions ensuring main distro is deployed: checking if main distro is up to date: checking main distro bootstrap version: getting main distro bootstrap version: open \wsl$\docker-desktop\etc\wsl_bootstrap_version: The network name…

golang学习笔记3-变量的声明

注&#xff1a;本人已有C&#xff0c;C,Python基础&#xff0c;只写本人认为的重点。 一、变量的三种声明方式 func main() {//方式1&#xff0c;指定数据类型&#xff0c;声明后若不赋值&#xff0c;使用默认值//比如int的默认值是0&#xff0c;string的默认值是空串var i in…

购买转化预测_逻辑回归,网格搜索与交叉验证

数据入口&#xff1a;在线书店A/B测试数据集 - Heywhale.com 数据说明 字段说明Theme显示主题&#xff0c;dark&#xff08;深色&#xff09;&#xff1b;light&#xff08;浅色&#xff09;Click Through Rate点击率&#xff1a;用户点击网站上链接或按钮的比例Conversion R…