锁策略, cas 和 synchronized 优化过程

news2024/9/24 6:23:57

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等類型進行封裝,從而可以原子地完成++等操作。標準庫裏也有。

      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.coloradmin.cn/o/2159664.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在虚幻引擎中实现Camera Shake 相机抖动/震屏效果

在虚幻引擎游戏中创建相机抖动有时能让画面更加高级 , 比如 遇到大型的Boss , 出现一些炫酷的特效 加一些短而快的 Camera Shake 能达到很好的效果 , 为玩家提供沉浸感 创建Camera Shake 调整Shake参数 到第三人称或第一人称蓝图 调用Camera Shake Radius值越大 晃动越强

Nginx基础详解1(单体部署与集群部署、负载均衡、正反代理、nginx安装)

本阶段的任务 1.学会集群的操作概念 2.完成对Nginx的入门操作 3.使用Nginx实现集群和负载均衡 4.使用Nginx实现高可用的方案 目录 1.单体部署与集群部署 1.1单体部署的概念 1.2单体部署的优缺点 1.3集群部署的概念 1.4集群部署的优缺点 1.5集群部署需要注意的点 1.…

嵌入式linux方向细分工作岗位分析

大家好,今天主要给大家分享一下,linux方向细分的工作岗位有哪些?,为即将进入linux领域的开发者指明方向。 第一:总结分布 第二:Linux BSP工程师岗位 工作内容: 1、开发和维护Linux系统的板级支持包(BSP),包括启动加载程序、设备驱动、文件系统等。 2、负责解决硬件和软…

2003-2022年各省区域创新能力评价相关指标数据(报告年份2003-2022年)

2003-2022年各省区域创新能力相关指标数据&#xff08;报告年份2003-2022年&#xff09; 1、来源&#xff1a;2003-2022年中国区城创新能力评价报告 2、指标&#xff1a;综合值、知识创造综合指标、研究开发投人综合指标、专利综合指标、科研论文综合指标、知识获取综合指标、…

个人导航网站介绍和部署

前言&#xff1a; 大家好&#xff0c;我是神的孩子都在歌唱&#xff0c;这是我csdn的博客 , 这是我做的一个神唱导航网站项目&#xff0c;这是一个练习项目&#xff0c;所以还存在很多问题&#xff0c;目的是方便收集和查阅日常浏览的网站&#xff0c;代码完全开源github&#…

LeetCode 面试经典150题 201.数字范围按位与

题目&#xff1a;给你两个整数 left 和 right &#xff0c;表示区间 [left, right] &#xff0c;返回此区间内所有数字 按位与 的结果&#xff08;包含 left 、right 端点&#xff09;。 提示&#xff1a;0 < left < right < 2^31 - 1 思路&#xff1a; 位与的特性…

leetcode91. 解码方法,动态规划

leetcode91. 解码方法 一条包含字母 A-Z 的消息通过以下映射进行了 编码 &#xff1a; “1” -> ‘A’ “2” -> ‘B’ … “25” -> ‘Y’ “26” -> ‘Z’ 然而&#xff0c;在 解码 已编码的消息时&#xff0c;你意识到有许多不同的方式来解码&#xff0c;…

【漏洞复现】HIKVISION 视频编码设备接入网关 showFile.php 任意文件下载漏洞

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

PHP智慧教育新篇章优校管理系统小程序源码

智慧教育新篇章 —— 优校管理系统 &#x1f680;【开篇启航&#xff1a;智慧教育的浪潮已至】 在这个日新月异的时代&#xff0c;教育也在悄然发生着变革。随着科技的飞速发展&#xff0c;智慧教育已成为教育领域的新风尚。而“优校管理系统”&#xff0c;正是这股浪潮中的佼…

Keil5 操作

目录 1.Debug&#xff08;软件模拟调试&#xff1a;&#xff09;&#xff1a; 2.代码提示设置&#xff1a; 3.添加. c与.h文件&#xff1a; 常用技巧 安装下载推荐&#xff1a;正点原子 1.Debug&#xff08;软件模拟调试&#xff1a;&#xff09;&#xff1a; 文章讲解 …

【例题】证明极限

已知&#xff1a; ∀ ε > 0 , ∃ n > N , ∣ a n − A ∣ < ε \forall \varepsilon >0, \exist n>N,|a_n-A|<\varepsilon ∀ε>0,∃n>N,∣an​−A∣<ε 目标&#xff1a; ∀ ε > 0 , ∃ n > N 1 , ∣ a 1 . . . a n n − A ∣ < ε \…

pytorch学习笔记二:用pytorch神经网络模型做气温预测、分类任务构建和分类网络构建、卷积神经网络原理介绍

文章目录 一、搭建pytorch神经网络进行气温预测1&#xff09;基础搭建2&#xff09;实际操作标识特征和标签3&#xff09;构建成标准化的预处理数据&#xff08;做标准化收敛速度更快&#xff09; 二、按照建模顺序构建完成网络架构1&#xff09;np.array格式的标签(y)和特征(x…

从入门到精通:计算机视觉学习路线与实战项目推荐

全面解析计算机视觉的学习路径&#xff0c;深入探讨关键技术与实战项目&#xff0c;助您快速掌握核心技能 引言 随着人工智能的飞速发展&#xff0c;计算机视觉已成为AI领域中最具潜力和应用价值的分支之一。从自动驾驶到医疗影像分析&#xff0c;计算机视觉技术正在改变我们的…

9.23-部署项目

部署项目 一、先部署mariadb [rootk8s-master ~]# mkdir aaa [rootk8s-master ~]# cd aaa/ [rootk8s-master aaa]# # 先部署mariadb [rootk8s-master aaa]# # configmap [rootk8s-master aaa]# vim mariadb-configmap.yaml apiVersion: v1 kind: ConfigMap metadata:name: ma…

【通俗易懂介绍OAuth2.0协议以及4种授权模式】

文章目录 一.OAuth2.0协议介绍二.设计来源于生活三.关于令牌与密码的区别四.应用场景五.接下来分别简单介绍下四种授权模式吧1.客户端模式1.1 介绍1.2 适用场景1.3 时序图 2.密码模式2.1 介绍2.2 适用场景2.3时序图 3.授权码模式3.1 介绍3.2 适用场景3.3 时序图 4.简化模式4.1 …

【LIO-SAM】LIO-SAM论文翻译(2020年)

【LIO】LIO-SAM论文翻译&#xff08;2020年&#xff09; 1&#xff0e;Abstract&#xff12;&#xff0e;INTRODUCTION&#xff14;&#xff0e;通过平滑和映射实现激光雷达惯性里程计A. 系统概述B. IMU Preintegration Factor&#xff08;推导过程参阅&#xff09;C. Lidar Od…

对onlyoffice进行定制化开发

基于onlyoffice8.0源码&#xff0c;进行二次开发&#xff0c;可实现包括但不限于以下的功能 1、内容控件的插入 2、内容空间的批量替换 3、插入文本 4、插入图片 5、添加&#xff0c;去除水印 6、修改同时在线人数限制 7、内容域的删除 8、页面UI的定制化 9、新增插件开发 10、…

Pytest-如何将allure报告发布至公司内网

原理简介 使用Python启动HTTP服务器&#xff0c;指定一个端口号port&#xff0c;内网用户可以使用ipport访问报告。 本文章继续进阶&#xff0c;简单使用nginx进行一个代理&#xff0c;使用域名可以直接访问报告。 前情概述 Pytest-allure如何在测试完成后自动生成完整报告&am…

Ansible流程控制-条件语句_循环语句

文章目录 Ansible流程控制条件语句且、或、非、是模糊条件when指令的详细使用方法 循环语句如何使用使用item变量结合with_items或loop指令item变量有固定子元素&#xff1f; 实例-服务器安装基础环境优化需求部分实现换指定新仓库安装基础软件包 Ansible流程控制 一、 1. 条件…

opencv4.5.5 GPU版本编译

一、安装环境 1、opencv4.5.5 下载地址&#xff1a;https://github.com/opencv/opencv/archive/refs/tags/4.5.5.ziphttps://gitee.com/mirrors/opencv/tree/4.5.0 2、opencv-contrib4.5.5 下载地址&#xff1a;https://github.com/opencv/opencv_contrib/archive/refs/tags/4…