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

Java面试题:多线程3

CAS

Compare and Swap(比较再交换)

体现了一种乐观锁的思想,在无锁情况下保证线程操作共享数据的原子性.

请添加图片描述

线程A和线程B对主内存中的变量c同时进行修改

在线程A中存在预期值a,修改后的更新值a1

在线程B中存在预期值b,修改后的更新值b1

当且仅当预期值和主内存中的变量值相等时,将主内存中的变量c修改为对应线程的更新值并返回true,如果失败,返回false并通过自旋的方式一直比较和尝试,直到CAS操作成功.

自旋
while(true){预期值a = 共享变量c更新值a1 = a++;if(CAS){return;}
}

如果失败,就会重新读取主内存中的数据并进行数据操作,直到CAS成功.

CAS的底层实现

通过Unsafe类直接调用操作系统底层的CAS指令

依赖于三个由native修饰的本地方法

native:由java提供的原生方法

compareAndSwapObject()

compareAndSwapInt()

compareAndSwapLong()

参数中包含:

当前值©,预期值(a)和更新值(a1)

乐观锁和悲观锁

乐观锁思想:

CAS思想,不考虑其他线程来进行并发修改的情况,修改了再进行自旋操作.

悲观锁思想:

synchronized思想,时刻考虑其他线程来进行并发修改,上锁时其他线程全部阻塞直到解锁被唤醒.

http://www.lryc.cn/news/341818.html

相关文章:

  • 【QEMU系统分析之实例篇(十八)】
  • pyside6的调色板QPalette的简单应用
  • 苍穹外卖项目
  • error: Execution was interrupted, reason: signal SIGABRT
  • HarmaonyOS鸿蒙应用科普课
  • 数码管的显示
  • 关于海康相机和镜头参数的记录
  • 【JavaScript】运算符
  • LabVIEW航空发动机主轴承试验器数据采集与监测
  • CVE-2022-2602:unix_gc 错误释放 io_uring 注册的文件从而导致的 file UAF
  • LSTM实战笔记(部署到C++上)——更新中
  • 鸿蒙内核源码分析(消息队列篇) | 进程间如何异步传递大数据
  • Sentinel流量防卫兵
  • 微信小程序:14.什么是wxs,wxs的使用
  • Django运行不提示网址问题
  • web安全---xss漏洞/beef-xss基本使用
  • 第一天学习(GPT)
  • 【C++之AVL树旋转操作的详细图解】
  • 制作Android分区镜像
  • 如何代码激活service——packageKit 系统更新番外
  • 音视频常用工具
  • 周刊是聪明人筛选优质知识的聪明手段!
  • 设计模式Java实现-建造者模式
  • 微博视频怎么下载无水印
  • 为什么要梯度累积
  • 知识图谱在提升大语言模型性能中的应用:减少幻觉与增强推理的综述
  • P8800 [蓝桥杯 2022 国 B] 卡牌
  • MySQL商城数据表(80-84)
  • 使用Gitbook生成电子书
  • 设计模式之传输对象模式