当前位置: 首页 > news >正文

原子性问题的解决思路--锁

原子性问题的源头是线程切换,如果禁止线程切换,则不会产生原子性问题,但是线程的切换依赖于CPU的中断,多核环境下是无法实现的。列举一个典型的例子,在32位CPU上执行long行变脸的写操作,long型变量为64位,在32位CPU上执行写操作会分为两次,写高32位和写低32位。

多核场景下,同一时刻可能有两个线程同时执行,一个执行在CPU-1上,一个执行在CPU-2上,此时若禁止CPU中断,只能保证CPU上的线程连续执行,却无法保证同一时刻只有一个线程执行,如果两个线程同时写long型变量的高32位,则结果就会超出预期。

这里就有一个非常重要的条件:同一时刻只有一个线程执行,称之为“互斥”。如果可以保证对共享变量的操作是互斥的,那么原子性问题就可以得到解决。

锁的简易模型

把一段需要互斥执行的代码成为 临界区,线程进入临界区之前,需要先加锁,如果加锁成功,则进入临界区,该线程持有锁;如果加锁失败,则线程等待,直到持有锁的线程执行完临界区的代码,释放锁。

锁的改进模型

在多线程的世界里,锁不是孤立存在的,通常情况下锁是用来保护某个资源的

synchronized关键字

java提供synchronized关键字来实现锁,他可以修饰方法块也可以修饰方法:

class X {
    //修饰非静态方法
    synchronized void foo() {
        //临界区
    }
    
    //修饰静态方法
    synchronized static void bar() {
        //临界区
    }
    
    //修饰代码块
    Object obj = new Object();
    void baz() {
        synchronized(boj) {
            //临界区
        }
    }
}
复制代码

synchronized关键字隐式包含了lock()和unlock()操作,无需手动unlock。

关于加锁的对象,对于静态方法,锁定的是当前类的Class对象;对于非静态方法,锁定的就是当前的对象实例。

转载于:https://juejin.im/post/5cbc2877e51d456e8c1d3c4e

相关文章:

  • Day1 BFS算法的学习和训练
  • 使用DataWorks来调度AnalyticDB任务
  • 好程序员分享ApacheSpark常见的三大误解
  • 2017-12-05 JavaScript实现ZLOGO子集: 前进+转向
  • 阿里云性能测试 PTS 上手体验
  • FastDfs 分布式文件系统 安装与配置 (实测成功)
  • 读JVM(深入理解Java虚拟机)笔记(一)
  • Vue之坑
  • flask 第七章 简陋版智能玩具 +MongoDB初识和基本操作
  • 4-1 requests库的安装
  • 学起来:Flutter将支持桌面应用开发
  • 基于binlog方式搭建MySQL主从
  • C# 虹软SDK视频人脸识别和注册
  • redis-主从复制
  • 再见 异步回调, 再见 Async Await, 10 万 个 协程 的 时代 来 了
  • HTTP请求重发
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • Webpack 4x 之路 ( 四 )
  • 基于HAProxy的高性能缓存服务器nuster
  • 近期前端发展计划
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 最近的计划
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • #1014 : Trie树
  • #pragma pack(1)
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (2020)Java后端开发----(面试题和笔试题)
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (附源码)计算机毕业设计ssm电影分享网站
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (五)MySQL的备份及恢复
  • (一)Neo4j下载安装以及初次使用
  • (转)德国人的记事本
  • *2 echo、printf、mkdir命令的应用
  • .Net 4.0并行库实用性演练
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .net程序集学习心得
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • ::
  • @cacheable 是否缓存成功_Spring Cache缓存注解
  • @基于大模型的旅游路线推荐方案
  • [2010-8-30]
  • [Angular] 笔记 6:ngStyle
  • [ASP]青辰网络考试管理系统NES X3.5
  • [AutoSar]BSW_OS 01 priority ceiling protocol(PCP)
  • [Big Data - Kafka] kafka学习笔记:知识点整理
  • [C/C++随笔] char与unsigned char区别
  • [C++]类和对象(中)
  • [DAU-FI Net开源 | Dual Attention UNet+特征融合+Sobel和Canny等算子解决语义分割痛点]
  • [English]英语积累本