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

java重点学习-线程的并发安全(1)

九 线程的并发安全

9.1 syncronized关键字的底层原理

  • Synchronized【对象锁】采用互斥的方式让同一时刻至多只有一个线程能持有【对象锁】
  • 它的底层由monitor实现的,monitor是jvm级别的对象(C++实现)线程获得锁需要使用对象(锁)关联monitor
  • 在monitor内部有三个属性,分别是owner、entrylist、waitset
  • 其中owner是关联的获得锁的线程,并且只能关联一个线程;entrylist关联的是处于阻塞状态的线程;waitset关联的是处于Waiting状态的线程

9.2 Monitor实现的锁属于重量级锁,你了解过锁升级吗?

  • Monitor实现的锁属于重量级锁,里面涉及到了用户态和内核态的切换、进程的上下文切换,成本较高,性能比较低。
  • 在IDK1.6引入了两种新型锁机制:偏向锁和轻量级锁,它们的引入是为了解决在没有多线程竞争或基本没有竞争的场景下因使用传统锁机制带来的性能开销问题。

9.3 你谈谈 JMM(Java内存模型)

  • JMM(Java Memory Model)Java内存模型,定义了共享内存多线程程序读写操作的行为规范,通过这些规则来规范对内存的读写操作从而保证指令的正确性
  • JMM把内存分为两块,一块是私有线程的工作区域(工作内存),一块是所有线程的共享区域(主内存)
  • 线程跟线程之间是相互隔离,线程跟线程交互需要通过主内存

9.4 CAS

CAS的全称是:Compare And Swap(比较再交换),它体现的一种乐观锁的思想,在无锁情况下保证线程操作共享数据的原子性。

在JUC(java.util.concurrent)包下实现的很多类都用到了CAS操作AbstractQueuedSynchronizer(AQS框架)

AtomicXXX类

9.5 volatile的理解

一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义

① 保证线程间的可见性
  • 用 volatile 修饰共享变量,能够防止编译器等优化发生,让一个线程对共享变量的修改对另一个线程可见

编辑结果:读不到的线程三中的stop

② 禁止进行指令重排序

指令重排:用 volatile 修饰共享变量会在读、写共享变量时加入不同的屏障阻止其他读写操作越过屏障,从而达到阻止重排序的效果

9.6 什么是AQS?


http://www.mrgr.cn/news/26092.html

相关文章:

  • 绝佳的知乎展示形式,助力品牌信息全面曝光
  • DAPIER™(大片儿),一款专业的计算机艺术软件,一键式计算机艺术品快速智能(非AI)生成程序
  • 98、RS485全自动收发电路入坑笔记
  • 桥接网络设置多用户lxd容器
  • .SUFFIXES:
  • 查询数据起始时间判断
  • Vue实用操作-2-如何使用网页开发者工具
  • 网页上的文件我不想下载只想看,一个插件满足你(所有文件)
  • leetcode 2398.预算内的最多机器人数目
  • Ready Go
  • 数据库基础知识---------------------------(1)
  • 【Qt笔记】QScrollArea控件详解
  • Web3入门指南:从基础概念到实际应用
  • N2011A叉车限速器如何实现超速报警且强制限速的
  • 【Flutter】⭐️UI库推荐! Flutter 中使用 dropdown_search实现下拉搜索效果
  • volatile关键字
  • 北京网页制作-网站策划
  • Shell:初识sed、awk
  • C++11第四弹:包装器
  • 干货分享,大厂内部压测方案设计