线程简单随笔

news2025/1/11 18:29:47

线程安全性

  • 原子性:synchornized、AtomicXXX、Lock

​ 原子性是指汇编指令不可拆分的,如同数据库中的事务,要么全部成功,要么全部失败一样

  • 可见性:synchornized、volatile
  • 有序性:synchornized、volatile

java中的同步锁synchronized

synchronized锁范围有实例级别和class级别.

public static int i = 0;
public void increment() {
    // 
    synchronized (this) {
        i++;
    }
    // 修饰class级别的,静态方法也是JVM中唯一的,所以这个和静态方法一样
    synchronized (Demo1.class) {
        i++;
    }
}

public static void main(String[] args) {
    Demo1 demo1 = new Demo1();
    Demo1 demo2 = new Demo1();
    // 修饰实例类级别的锁
    synchronized (demo1) {
        System.out.println("这个是demo1持有的锁");
    }
    synchronized (demo2) {
        System.out.println("这个是demo2持有的锁");
    }
}

作用范围

  • 修饰实例方法
  • 静态方法
  • 修饰代码块

对象和锁标记存储的关系

锁的标记或者锁的竞争依赖于对象。影响锁的作用范围,本质上就是对象的生命周期。

而锁标记会存储在对象头中。

  • InstanceOOP

An InstanceOOP is an instance of a java class.

这里需要对JVM有一定的了解,顺便附上JVM的官网链接

https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html

What is java stack? 
Each Java Virtual Machine thread has a private Java Virtual Machine stack, created at the same time as the thread. A Java Virtual Machine stack stores frames (§2.6). A Java Virtual Machine stack is analogous to the stack of a conventional language such as C: it holds local variables and partial results, and plays a part in method invocation and return. Because the Java Virtual Machine stack is never manipulated directly except to push and pop frames, frames may be heap allocated. The memory for a Java Virtual Machine stack does not need to be contiguous.

在这里插入图片描述

Demo1.class,经过类加载后,进入到JVM的元空间的方法区,存储类信息,会产生一个java.lang.Class实例,而这个实例则存在堆里边。

// 获取Hello类的InstanceKlazz
Clazz clazz = Hello.class;
// 获取到Hello类的实例,在堆内存的实例中,会有一个元数据指针,指向了方法区里边的Hello.class
Hello h = new Hello();

markOOP

锁主要存在四中状态,依次是:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态,他们会随着竞

争的激烈而逐渐升级。

在这里插入图片描述

在jdk1.6之前,synchronized是重量级锁。带有线程的阻塞和唤醒的锁,我们称为重量级锁。这个动作会涉及到内核态的切换,内核态的切换会涉及到CPU的指令,就会有时间片切换的问题,带来一定的性能开销;为了去减少这种开销,synchronized在这里做了优化,在能不阻塞的情况下,去竞争到锁资源。

偏向锁

数据安全性和性能的平衡

轻量级锁

属于一种自旋锁,带有自适应重试机制,会带来CPU资源的浪费,但相对于重量级锁,会有一定的性能平衡。

重量级锁

带有线程的阻塞和唤醒的锁,我们称为重量级锁

锁的升级

在这里插入图片描述

CPU上下文切换

CPU时间片切换会带来一些性能损失,主要是因为

  • CPU寄存器和执行位置的保存
  • 多CPU之间的缓存数据

CAS

compareAndSwap

ABA问题:增加version去判断

线程可见性、有序性

硬件、操作系统(线程)、编译器(优化)会导致线程安全问题.

程序寄存器、L1 Cache/L2 Cache/L3 Cache(CPU多级缓存)、

而增加CPU高速缓存这个优化也会带来缓存一致性问题。缓存不一致就会带来可见性问题。

解决缓存一致性问题的方案有 MESI协议

volatile关键字

可以避免编译器优化,以及解决CPU缓存不一致的问题,从而达到可见性。

另外volatile也可以解决有序性的问题。

线程可见性规则之Happens-Before原则的定义

  • 程序次序规则(Program Order Rule):在一个线程内,按照控制流顺序,书写在前面的操作先行发生于书写在后面的操作。

  • 管程锁定规则(Monitor Lock Rule):一个unlock操作先行发生于后面对同一个锁的lock操作。

  • volatile变量规则(Volatile Variable Rule):对一个volatile变量的写操作先行发生于后面对这个变量的读操作。

  • 线程启动规则(Thread Start Rule):Thread对象start()方法先行发生于此线程的每一个动作。

  • 线程终止规则(Thread Termination Rule):线程中的所有操作都先行发生于对此线程的终止检测,我们可以通过Thread.join()方法和Thread.isAlive()的返回值等手段检测线程是否已经终止执行。

  • 线程中断规则(Thread Interruption Rule):对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生,可以通过Thread.interrupted()方法检测到是否有中断发生。

  • 对象终结规则(Finalizer Rule) :一个对象的初始化完成(构造函数结束)先行发生于它的finalize()方法的开始。

  • 传递性(Transitivity):如果操作A先行发生于操作B,操作B先行发生于操作C,那就可以得出操作A先行发生于操作C的结论。

在这里插入图片描述

共享锁

同一时间允许有多个线程去抢占这个锁

独占锁

同一时间只允许一个线程去抢占这个锁

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/917804.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安装docker服务 配置镜像

1.安装docker服务,配置镜像加速器 2.下载系统镜像(Ubuntu、 centos) 3.基于下载的镜像创建两个容器 (容器名一个为自己名字全拼,一个为首名字字母) 4.容器的启动、 停止及重启操作 操作代码启动docker sta…

OLED透明屏硬性设计:产品设计中的创新之道

OLED透明屏作为一项革命性的技术创新,不仅具备透明度,而且还拥有硬性的特点,为各行业带来了前所未有的设计和应用可能性。 那么,在这篇文章中,尼伽将深入探索OLED透明屏的硬性设计优势,并通过相关数据和报…

ubuntu20.04安装gcc5.4 g++5.4

在进行ubuntu20.04的系统中安装gcc g5.4中,会出现安装问题 1、pip安装,失败 2、使用apt-get install 进行安装时,提示没有候选项; 原因:ubuntu20.04的系统下,系统默认安装的gcc9.0的版本,默认…

HVV爆火漏洞:最新 WPS RCE (远程命令执行) 复现

最近HVV爆出的很火的WPS命令执行漏洞&#xff0c;其实并不是0DAY&#xff0c;早在2019年就出现了&#xff0c;只不过最近EXP才公开。接下来我们来复现一遍。 0x00 影响版本 WPS Office 2023 个人版 < 11.1.0.15120WPS Office 2019 企业版 < 11.8.2.12085 0x01 环境配置…

光学成像传感器均匀性校准积分球光源

均匀光源被广泛应用于光学成像、遥感仪器的研制与标定等领域。积分球作为一种测量发光体光学参数的高效率仪器&#xff0c;常用于测量光谱强度与功率、光通量、散射体分布、颜色温度、电学特性等参数。积分球光源主要用途是可以作为参考源校准各种光度辐射仪器&#xff0c;其照…

数据结构与算法基础-学习-29-图之关键路径

图的其他相关知识点和源码分享可以参考之前的博客&#xff1a; 《数据结构与算法基础-学习-23-图之邻接矩阵与邻接表》&#xff0c; 《数据结构与算法基础-学习-24-图的遍历之DFS&#xff08;深度优先搜索&#xff09;和BFS&#xff08;广度优先搜索&#xff09;》&#x…

字节跳动 Git 的正确使用姿势与最佳实践

版本控制Git 黑马&尚硅谷 Git的前世今生 方向介绍 为什么要学习Git 1.0 Git是什么 1.1 版本控制 1.1.1 本地版本控制 1.1.2 集中版本控制 1.1.3 分布式版本控制 我们已经把三个不同的版本控制系统介绍完了&#xff0c;Git 作为分布式版本控制工具&#xff0c; 虽然目前来讲…

Python Web开发 OAuth2.0 简介

我们经常看到或者用到一些可以使用微博、微信、支付宝等账号登录的应用&#xff0c;还有一些微博助手、微信公众号助手、客户端之类的东西&#xff0c;这些是怎么做的呢&#xff0c;背后的原理是什么呢&#xff1f;为什么公众号配置起来那么繁琐呢&#xff1f;什么是 access to…

数据标注工具:功能及评估

从垃圾邮件过滤到个性化的聊天机器人体验&#xff0c;人工智能创新正日益成为我们日常生活中的一部分。大多数还没有部署人工智能的公司&#xff0c;都在考虑如何在其内部和外部流程中采用人工智能和机器学习工具。 在接触人工智能和机器学习前&#xff0c;很多人都不知道&…

空间换时间-五秒出解:从900ms到5ms的幕后优化大揭秘!

作者&#xff1a;麦客奥德彪 探索数据操作的效率是软件开发中的一项重要任务。开发中遇到了Java中的ArrayList和removeAll方法&#xff0c;意外发现当面对大量数据时&#xff0c;其执行效率可能会让人瞠目结舌&#xff0c;高达900毫秒以上&#xff01;然而&#xff0c;通过一系…

景区气象站

景区气象站是通过各种传感器实现气象数据采集&#xff0c;这些传感器就是它的核心部件&#xff0c;拥有抗风、防腐、耐尘的优势&#xff0c;可以在各种复杂气象条件下稳定工作&#xff0c;为工作人员提供高精度的气象数据。搭配气象通讯主机&#xff0c;对传感器采集的数据进行…

2023-08-23 LeetCode每日一题(统计点对的数目)

2023-08-23每日一题 一、题目编号 1782. 统计点对的数目二、题目链接 点击跳转到题目位置 三、题目描述 给你一个无向图&#xff0c;无向图由整数 n &#xff0c;表示图中节点的数目&#xff0c;和 edges 组成&#xff0c;其中 edges[i] [ui, vi] 表示 ui 和 vi 之间有一…

echarts 之 科技感进度条

1.图片展示 2.代码实现 /* ng qty 进度条 */ <template><div class"ngqty-progress"><div class"ngqty-info"><span>X4</span><span>50%</span></div><div :id"barNgQtyProgress index" c…

ubuntu18.04复现yolo v8之CUDA与pytorch版本问题以及多CUDA版本安装及切换

最近在复现yolo v8的程序&#xff0c;特记录一下过程 环境&#xff1a;ubuntu18.04ros melodic 小知识&#xff1a;GPU并行计算能力高于CPU—B站UP主说的 Ubuntu可以安装多个版本的CUDA。如果某个程序的Pyorch需要不同版本的CUDA&#xff0c;不必删除之前的CUDA&#xff0c;…

wazuh环境配置

目录 一、wazuh的安装 1.1官方仓库安装 1.2虚拟机OVA安装 1.2.1 然后执行下面命令 1.2.2 这里还要下载脚本和config.yml配置文件&#xff0c;用来生成证书​编辑 1.2.3然后编辑config.yml文件&#xff0c;将下面的三个IP地址改为一样的 1.2.4运行./wazuh-certs-tool.sh以…

Linux Ubuntu系统安装OpenVPN服务

OpenVPN Ubuntu/Linux 服务端安装 官方文档&#xff1a;https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage 介绍 嘿&#xff0c;今天我们要探讨的话题是OpenVPN——那个让你在互联网上以安全又私密的方式冲浪的神奇工具。 首先&#xff0c;你可能会问&#xff…

机器学习模型的可解释性算法汇总

模型可解释性汇总 现有许多机器学习模型,尤其是深度学习模型,虽然他们的预测效果很好,但不具备很强的解释性,难以解释模型内部是如何作出决策的。这确实会带来很多问题: 信任度问题。如果一个模型无法解释自身,人们很难 100%信任它。这对于一些重要应用场景如医疗诊断来说尤其重…

【安全】原型链污染 - Code-Breaking 2018 Thejs

目录 准备工作 环境搭建 加载项目 复现 代码审计 payload 总结 准备工作 环境搭建 Nodejs BurpSuite 加载项目 项目链接 ① 下载好了cmd切进去 ② 安装这个项目 可以检查一下 ③运行并监听 可以看到已经在3000端口启动了 复现 代码审计 const fs require(fs) cons…

整理mongodb文档:聚合管道

个人博客 整理mongodb文档:聚合管道 个人博客&#xff0c;求关注&#xff0c;电脑版看体验更加&#xff0c;如果不够清晰&#xff0c;请指出来&#xff0c;谢谢 文章概叙 文章主要通过几个常用的聚合表达式来介绍聚合管道的使用&#xff0c;以及从索引的角度来介绍聚合管道…

使用lambda表达式提取共用代码使其更加简洁

1、在开发预下单接口访问并发问题出现需要加锁代码如下 RLock lock redissonClient.getLock(String.format(appointmentKey, activityId, studentId));try {boolean tryLock lock.tryLock(10, 20, TimeUnit.SECONDS);if (tryLock) {AppointmentMallOrderInfoDTO appointmentM…