线程同步之Synchronized&CAS&各种锁的介绍及对比

2023-11-11

1.Synchronized

1.1 简介

Java的关键字,提供了并发场景下的数据可见性和原子性,保证线程安全

1.2 应用方式

修饰实例方法:对当前实例加锁,当两个不同的实例对象同时操作共享资源时,可能出现线程安全问题。

public synchronized void increase()

修饰静态方法:对当前类的Class对象加锁,当多个实例对象同时操作静态方法中的共享资源时,可以保证线程安全。线程A调用一个实例对象的非static synchronized方法,线程B调用类的static synchronized方法是被允许的,因为一个是Class对象锁,一个是实力对象锁。

public static synchronized void increase()

修饰同步代码块:给指定对象加锁

synchronized(instance/this)

1.3 原理

前提:每个对象都有一个对象头,对象头中有一个和synchronized相关的字段,该字段是一个指向monitor对象的指针,synchronized通过获取monitor对象的方式获取锁。(可以去这个链接查看一下更加详细的解释链接

synchronized修饰代码块的底层原理

依赖于monitor对象的enter和exit操作,对应于monitorenter和monitorexit字节码指令,这两个指令分别指明了同步代码块的起始和结束位置,执行monitorenter时尝试获取对monitor的持有权,如果此时monitor的计数器为0,则获取到这个锁,并将计数器设置为1。

synchronized修饰方法的底层原理

方法级的同步是隐式的,不需要通过字节码指令来控制,JVM通过方法常量池中的方发表结

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线程同步之Synchronized&CAS&各种锁的介绍及对比 的相关文章

  • Java 中等效的并行扩展

    我在 Net 开发中使用并行扩展有一些经验 但我正在考虑在 Java 中做一些工作 这些工作将受益于易于使用的并行库 JVM 是否提供任何与并行扩展类似的工具 您应该熟悉java util concurrent http java sun
  • 在 Java 中连接和使用 Cassandra

    我已经阅读了一些关于 Cassandra 是什么以及它可以做什么的教程 但我的问题是如何在 Java 中与 Cassandra 交互 教程会很好 如果可能的话 有人可以告诉我是否应该使用 Thrift 还是 Hector 哪一个更好以及为什
  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • JAXb、Hibernate 和 beans

    目前我正在开发一个使用 Spring Web 服务 hibernate 和 JAXb 的项目 1 我已经使用IDE hibernate代码生成 生成了hibernate bean 2 另外 我已经使用maven编译器生成了jaxb bean
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • 在 Mac 上正确运行基于 SWT 的跨平台 jar

    我一直致力于一个基于 SWT 的项目 该项目旨在部署为 Java Web Start 从而可以在多个平台上使用 到目前为止 我已经成功解决了由于 SWT 依赖的系统特定库而出现的导出问题 请参阅相关thread https stackove
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • 如何从指定日期获取上周五的日期? [复制]

    这个问题在这里已经有答案了 如何找出上一个 上一个 星期五 或指定日期的任何其他日期的日期 public getDateOnDay Date date String dayName 我不会给出答案 先自己尝试一下 但是 也许这些提示可以帮助
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j
  • 使用 xpath 和 vtd-xml 以字符串形式获取元素的子节点和文本

    这是我的 XML 的一部分

随机推荐

  • 【DevOps】DevOps的新出路:平台工程

    DevOps的新出路 平台工程 DevOps是一种文化 是敏捷的一部分 主要是解决引入敏捷活动的持续开发 快速反馈后带来的新的运维问题 然也 DevOps的初衷是让开发能够掌握运维知识 对自己的产品全生命周期负责 you build it
  • 【MySQL】漫谈死锁

    一 前言 死锁是每个MySQL DBA 都会遇到的技术问题 本文自己针对死锁学习的一个总结 了解死锁是什么 MySQL如何检测死锁 处理死锁 死锁的案例 如何避免死锁 二 死锁 死锁 是并发系统中常见的问题 同样也会出现在Innodb系统中
  • 【大数据技术】Apache Beam实战指南

    关于 Apache Beam 实战指南系列文章 随着大数据 2 0 时代悄然到来 大数据从简单的批处理扩展到了实时处理 流处理 交互式查询和机器学习应用 近年来涌现出诸多大数据应用组件 如 HBase Hive Kafka Spark Fl
  • 库文件

    一 库文件简述 将用户写好的程序打包成一个整体 可以简单的把库文件看成一种代码仓库 它提供给使用者一些可以直接拿来用的变量 函数或类 在库文件的发展史上经历了 无库 静态链接库 动态链接库 的时代 静态链接库与动态链接库都是共享代码的方式
  • 时序预测

    时序预测 MATLAB实现基于PSO LSTM LSTM时间序列预测对比 目录 时序预测 MATLAB实现基于PSO LSTM LSTM时间序列预测对比 效果一览 基本描述 程序设计 参考资料 效果一览 基本描述 MATLAB实现基于PSO
  • 单片机毕业设计 stm32车牌识别系统

    文章目录 1 简介 2 项目课题背景 3 应用场景 3 1 小区和停车场方面的管理 3 2 交通道路的监控 3 3 收费站管理系统 3 4 车流统计 车牌验证和移动车载系统 4 系统设计方案 4 1 硬件方案 4 2 软件实现流程 5 硬件
  • 服务器受美国保护网站,该网站服务器受美国保护

    裘精 曾子曰 身也者 父母之遗体也 行父母之遗体 敢不敬乎 居处不庄 非孝也 事君不忠 非孝也 莅官不敬 非孝也 朋友不信 非孝也 战陈无勇 非孝也 五者不遂 灾及于亲 敢不敬乎 亨孰膻芗 尝而荐之 非孝也 养也 君子之所谓孝也者 国人称愿
  • 爬虫http响应状态及出错代码含义

    100 客户必须继续发出请求 101 客户要求服务器根据请求转换HTTP协议版本 200 交易成功 201 一提示知道新文件的URL 202 接受和处理 但处理未完成 203 返回信息不确定或不完整 204 请求收到 但返回信息为空 285
  • 开源进展

    作为连接实体对象 人或物 的现实身份与链上身份的可信映射 实现实体对象之间安全可信的数据授权与交换 分布式身份技术解决方案在推动区块链应用繁荣及可信数据流转的过程中扮演着重要角色 WeIdentity是一套实体身份认证及可信数据交换技术解决
  • Python3.7 安装pandas库

    pandas库 提供高性能易用数据类型和分析工具 原本使用pip install pandas语句安装即可 但是发现下载安装的速度太过缓慢 于是选择在官网下载 官网下载链接 https pypi org project pandas fil
  • python调用接口运行显示No tests were found 的解决方法

    python调用接口运行显示No tests were found 的解决方法 可能是python安装了pytest第三方包 而运行文件是以test开头命名的 可以选择修改文件名 不要以test开头 或者卸载pytest即可
  • C++从0到1(4):选择结构

    C 支持的三种程序运行结构 顺序结构 程序按顺序执行 不发生跳转 选择结构 依据条件是否满足 有选择的执行相应功能 循环结构 依据条件是否满足 循环多次执行某段代码 选择结构 1 if语句 include
  • 关于OLED移植出现Symbol oled_pow multiply defined

    问题 今天督促队友写代码 他反馈移植的OELD代码报错Symbol oled pow multiply defined 我查看了一下 发现在main c和SR04 c中都引用了OLED include oled h 如果将超声波代码里面的
  • AOP高级用法——获取方法的参数和返回值

    我们平时在使用springAop的时候 经常是将某一个方法定义为一个切入点 用来做前置 后置或环绕增强 但如果想得到切入点方法的参数 以及它的返回值就需要做一些特定的配置 普通的切面如下 Configuration Aspect publi
  • Python之defaultdict方法详解

    文章目录 字典dict介绍 collections defaultdict类 字典dict介绍 python中的dict是一个重要的数据类型 用 键 key 来索引 表示为dict key val 有以下特征 键可以是任何不可变 immut
  • Webpack5 - 区分开发和生产环境配置

    一 webpack 不同环境的配置 对于项目的开发和生产打包 这两种情况下 我们通常需要不同的webpack配置 有如下两种方法 可以针对不同环境 应用不同的 webpack 配置 二 方法一 根据环境不同导出不同的配置 webpack c
  • 【JavaScript编程语言】逻辑运算符,

    逻辑运算符 JavaScript 中有四个逻辑运算符 或 与 非 空值合并运算符 本文我们先介绍前三个 在下一篇文章中再详细介绍 运算符 虽然它们被称为 逻辑 运算符 但这些运算符却可以被应用于任意类型的值 而不仅仅是布尔值 它们的结果也同
  • PHP douyin无水印视频网页代码简版

  • arm汇编lr pc b bl ret指令函数调用和返回gif动图演示

    文章目录 pc 寄存器 lr寄存器 x30 ret返回指令 bl 跳转指令 带返回 b 跳转 不带返回 pc 寄存器 pc保存着当前指令执行的地址 相当于win32汇编里的eip寄存器 lr寄存器 x30 lr存储函数的返回地址 每次遇到r
  • 线程同步之Synchronized&CAS&各种锁的介绍及对比

    1 Synchronized 1 1 简介 Java的关键字 提供了并发场景下的数据可见性和原子性 保证线程安全 1 2 应用方式 修饰实例方法 对当前实例加锁 当两个不同的实例对象同时操作共享资源时 可能出现线程安全问题 public s