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

synchronized 学习序章

学习源:
https://www.bilibili.com/video/BV1aJ411V763?spm_id_from=333.788.videopod.episodes&vd_source=32e1c41a9370911ab06d12fbc36c4ebc

1.应用场景 不超卖,也要考虑性能问题(场景)

2.常见面试问题: sync出现异常是否释放锁
synchronized 和 Lock的区别
synchronized 和 volatile的区别

3.up举了几个例子

对于可见性:
run是共享变量
线程1是 while(run) 死循环
1秒后,线程2执行。线程2修改run为false后,打印退出。

预期线程2执行完成后,线程1立即结束。但是既然UP说存在可见性问题: 是指当一个线程对共享变量进行了修改,那么另外的线程可以立即看到修改后的最新值。

我猜会过一段时间结束。但是不知道会有多久。疑问是如果一直不做处理,会一直不可见吗?

接着是原子性。 这个概念深入我心。不再抄定义。我对于可见性容易忘,可能是我不够熟悉可见性的定义。对定义模糊导致的。可见性就是说对于共享变量的修改,其他线程可以立即感知。可见的东西是并发编程场景下,那个共享变量的可见性。一定要明确定义,才不会含含糊糊。

例子 i = i+1; 或者i++ 。 加操作与赋值操作,不是一个原子操作。

有序性:
程序执行顺序的优化。编译期、运行期 的优化。

  1. 同步代码块可以重新进入—》 可重入

5.synchronized —>不可中断

6.reentranLock可以中断

7.javap 反汇编 学习synchronized的原理。
monitorenter monitorexit

8.JVM 源码 C/C++ 学monitor 获得等待 释放。

9.无锁 偏向锁 轻量级 重量级。。。锁升级

10.对象头 填充 MarkWord 类信息。。

11.使用优化,减少范围。 降低力度。
hashTable 锁所有的数据。
ch 锁一桶

读写分离。。 读不加锁。写加。

12.openJDK 的

jcstress 引入依赖,可以进行压测。

在这里插入图片描述
这段程序,若指令重排。会导致出现0的结果。

因为 num=2 和 ready=true 没什么因果关系。可能会被重排序。

JCStress测试结果
在这里插入图片描述

14.CPU 缓存结构
在这里插入图片描述
L1 L2 靠近CPU 属于CPU
L3是共享的。

  1. java 内存结构 是 jvm 内存结构 栈 堆 元空间等。

    JMM 规范 java Memory Model
    java内存模型 oracle 规范 主要在讲synchronized .volatile等。

    指java操作内存遵守的规范。屏蔽了机器细节。但逻辑上整体和常见机器结构类似。 线程有自己的工作内存(放局部变量或者共享变量的副本)。 另外共享变量类数据,(类里的成员变量等),等放在主内存中。

    线程不能直接操作主内存中的变量。

    要拷贝到自己的工作内存。最后再同步回去。

    JMM 规范 作用:
    Java内存模型是一套在多线程读写共享数据时,对共享数据的可见性,有序性,和原子性的规则和保障。

    这套规范里面,主要产生了两个关键字。synchronized,volatile。编程也主要靠这俩保障。

up说。 JMM 与 CPU 硬件内存架构类似。但不完全一样。
个人理解,如果模型跑的好。 工作内存对应 CPU寄存器,或者专属部分的CPU缓存。
在这里插入图片描述

JMM 是规范,描述 共享变量的访问规则, 内存操作细节。 目的是为了 对三大问题 的解决。

人话,自己总结。

Java Memory Model 是jvm 对于 各种计算机 多CPU有自己独立寄存器/缓冲区 的现状的一种抽象。 用工作内存代表CPU专属数据空间。 用主内存代表CPU共享的数据空间。 基于这两种空间下操作数据定义了规范。保障了编程对共享变量操作的 原子性,可见性,有序性。

http://www.xdnf.cn/news/13322.html

相关文章:

  • 精读 2025 《可信数据空间标准体系建设指南》【附全文阅读】
  • 无需安装!在线数据库工具 :实战 SQL 语句经典案例
  • 大模型中Function Call的定义与核心功能
  • NLog 使用示例
  • PLC入门【7】基本指令的总结(MC、MCR)
  • CPU性能篇-系统CPU使用率很高,但找不到高CPU的应用-Day 04
  • 安全编程期末复习34(红色重点向下兼容)
  • 1.3 VSCode安装与环境配置
  • 如何写一份实用的技术文档?——以API接口文档为例
  • Microsoft Azure 马来西亚区域正式上线
  • C语言数据结构笔记5:Keil 编译器优化行为_malloc指针内存分配问题
  • 【动作】动作标签分析和导出系统(按照分类)
  • Python 基础语法(1)【 适合0基础 】
  • 【valse2025】CV与ML领域重要进展
  • 在线客服系统:企业成功的关键支柱
  • Xshell远程连接Kali(默认 | 私钥)Note版
  • SciencePlots——绘制论文中的图片
  • [java八股文][MySQL面试篇]索引
  • JavaScript事件循环机制详解
  • Unity轻松实现麦克风录音与播放
  • git管理github上的repository(二)
  • 中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
  • 嵌入式学习之系统编程(十三)数据库
  • STL 5 适配器
  • MySQL基础语法总结
  • 如何在 Python 中去除列表重复项并保留顺序
  • BeckHoff <--> 基恩士(CV-X300)三维机械手视觉系统的通讯 控制
  • minio私有桶授权访问
  • Leetcode 3574. Maximize Subarray GCD Score
  • java 面向对象编程