java并发编程的艺术1

news2024/9/23 19:23:51

1.上下文交换

减少上下文交换的方法

  • 无锁并发编程:进行数据操作,多线程竞争锁,引起上下文切换。将变量按照id 进行hash,不同线程处理不同段的数据

  • CAS(compare and swap)

    A线程和B线程都要修改变量X,先从内存中读取X放在各自的缓冲区。然后修改,在写回之前,先对比缓存区的和内存中的数据一样吗,一样再写回。

  • 创建线程数少一点

2.死锁

充要条件:互斥、请求保持、循环等待、不可剥夺

避免死锁:避免一个线程同时获得多个锁、避免一个锁同时获得多个资源、定时锁、加锁和解锁必须在一个数据库连接中

3.并发机制的底层实现原理

(1)voliate(保障数据修改的可见性)

step1:任意线程对数据的写入立刻刷新到主内存

使用汇编命令的LOCK#信号,确保在声言该信号期间,处理器可以独占任何共享内存。锁总线或者锁缓存,一般锁缓存。为了解决锁总线的劣势,引入了MESI协议。

step2:让缓存区的数据失效。

处理器使用嗅探技术保证它的内部缓存、系统内存和其他处理器的缓存的数据在总线上保持一致。不一致缓存中的数据就失效。

(2)synchronized

Java中的每一个对象都可以作为锁,对象头中有标记位标记是否锁。

  • 对于普通同步方法,锁是当前实例对象。

  • 对于静态同步方法,锁是当前类的Class对象。

  • 对于同步方法块{},锁是Synchonized括号里配置的对象。

代码块同步使用Monitorenter和monitorexit实现。monitorenter放在方法开始的时候,monitorexit放在方法结束和异常的地方。任何一个对象都有一个monitor与之关联。

(3)synchronized用的锁是存在Java对象头里的。

markword:存放hashcode、分代年龄、是否是偏向锁、锁类型标记位。

类型指针:

数组长度:

(4)锁的升级和对比

无锁状态、偏向锁状态、轻量级锁、重量级锁(只能升级不能降低)

**偏向锁加锁:**访问同步代码块并且获取锁的时候,就在对象头和栈帧的锁记录里面存储偏向的线程id。原来对象头存的是hashcode和分代年龄=》(变为)线程id。

在这里插入图片描述

释放偏向锁:等待竞争才会释放锁。等待全局安全点,看看持有偏向锁的线程还活着嘛。如果挂了就改成无锁状态,然后偏向本线程。如果线程还活着,就遍历栈帧和对象,锁记录偏向其他线程或者恢复成无锁状态、或者标记对象不适合使用偏向锁(锁升级)。

出现竞争、偏向次数太多了(锁升级)。

**轻量级锁加锁:**在线程栈创建锁空间,复制堆中对象Markword的数据,到锁空间中。多个线程通过CAS将堆中对象头的Mark word改成锁空间的地址。成功的那个线程就抢到锁了。加锁失败的线程一直自旋。阈值10升级成重量级锁。(while(true))

轻量级锁释放锁:使用原子的CAS操作将Displaced Mark Word替换回到对象头。如果失败了就是有线程在竞争锁,重新执行代码块的内容。

在这里插入图片描述

(5)CAS实现原子操作的三大问题

  • ABA问题:A->B->A,CAS算法认为它没有变。解决思路就是使用版本号。
  • 循环时间长开销大
  • 只能保证一个共享变量的原子操作

4.JMM java内存模型

在这里插入图片描述

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

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

相关文章

Classifier-Free Guidance (CFG) Scale in Stable Diffusion

1.Classifier-Free Guidance Scale in Stable Diffusion 笔记来源: 1.How does Stable Diffusion work? 2.Classifier-Free Diffusion Guidance 3.Guide to Stable Diffusion CFG scale (guidance scale) parameter 1.1 Classifier Guidance Scale 分类器引导是…

虚拟机及其Debian(kali)安装

本机电脑为Windows10系统专业版,在此基础上安装VMware和系统(Kali) 步骤如下 一、安装 VMware Workstation Pro v16.2.4 安装步骤可参照网上博客,该步骤较简单,此处不做讲解。文件中共计两个,其中一个是激活…

python的异常

异常 定义 异常是程序执行中发生的错误事件,它可以打断正常的指令流。Python提供了强大的异常处理机制,允许程序在发生错误时执行某些替代指令,而不是直接崩溃。 类型 TypeError:类型错误,比如尝试将字符串和整数相加。…

Nest.js 实战 (一):使用过滤器优雅地统一处理响应体

前言 在我们实际的业务开发中,我们可以看到后端接口返回格式都有一定的要求,假如我们统一规定接口的统一返回格式为: {data: any; // 业务数据code: number; // 状态码msg: string; // 响应信息timestamp: number; // 时间戳 }那么在 Nest.…

【数据结构】:时间和空间复杂度

目录 如何衡量一个代码的好坏 时间复杂度 概念 计算方法 实例计算 【实例1】 【实例2】 【实例3】 【实例4】:冒泡排序的时间复杂度 【实例5】:二分查找的时间复杂度 【实例6】:阶乘递归的时间复杂度 【实例7】:斐波那契…

昇思25天学习打卡营第22天|GAN图像生成

今天是参加昇思25天学习打卡营的第22天,今天打卡的课程是“GAN图像生成”,这里做一个简单的分享。 1.简介 今天来学习“GAN图像生成”,这是一个基础的生成式模型。 生成式对抗网络(Generative Adversarial Networks,GAN)是一种…

springboot系列九: 接收参数相关注解

文章目录 基本介绍接收参数相关注解应用实例PathVariableRequestHeaderRequestParamCookieValueRequestBodyRequestAttributeSessionAttribute 复杂参数基本介绍应用实例 自定义对象参数-自动封装基本介绍应用实例 ⬅️ 上一篇: springboot系列八: springboot静态资源访问&…

02-Redis未授权访问漏洞

免责声明 本文仅限于学习讨论与技术知识的分享,不得违反当地国家的法律法规。对于传播、利用文章中提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本文作者不为此承担任何责任,一旦造成后果请自行承担&…

【Windows】Microsoft PC Manager

使用 Microsoft PC Manager,用户可以轻松执行基本的计算机维护,并通过一键操作提升设备速度。这款应用程序提供了一系列功能,包括磁盘清理、启动应用管理、病毒扫描、Windows 更新检查、进程监控和存储管理。 Microsoft PC Manager 的关键特…

React学习笔记03-----手动创建和运行

一、项目创建与运行【手动】 react-scripts集成了webpack、bable、提供测试服务器 1.目录结构 public是静态目录,提供可以供外部直接访问的文件,存放不需要webpack打包的文件,比如静态图片、CSS、JS src存放源码 (1&#xff09…

xss复习总结及ctfshow做题总结xss

xss复习总结 知识点 1.XSS 漏洞简介 ​ XSS又叫CSS(Cross Site Script)跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的…

ASF平台

最近一直在研究滑坡,但是insar数据处理很麻烦,自己手动处理gamma有很慢,而且据师兄说,gamma处理还很看经验,我就又去看了很多python库和其他工具: isce mintpy pyint 也使用了asf上面的处理产品,虽然也…

H. Beppa and SwerChat【双指针】

思路分析&#xff1a;运用双指针从后往前扫一遍&#xff0c;两次分别记作数组a&#xff0c;b&#xff0c;分别使用双指针i和j来扫&#xff0c;如果一样就往前&#xff0c;如果不一样&#xff0c;i–,ans #include<iostream> #include<cstring> #include<string…

C#绘制含流动块的管道

1&#xff0c;效果。 2&#xff0c;绘制技巧。 1&#xff0c;流动块的实质是使用Pen的自定义DashStyle绘制的线&#xff0c;并使用线的偏移值呈现出流动的效果。 Pen barPen new Pen(BarColor, BarHeight);barPen.DashStyle DashStyle.Custom;barPen.DashOffset startOffse…

解读InnoDB数据库索引页与数据行的紧密关联

目录 一、快速走进索引页结构 &#xff08;一&#xff09;整体展示说明 &#xff08;二&#xff09;内容说明 File Header&#xff08;文件头部&#xff09; Page Header&#xff08;页面头部&#xff09; Infimum Supremum&#xff08;最小记录和最大记录&#xff09; …

太速科技-FMC207-基于FMC 两路QSFP+光纤收发子卡

FMC207-基于FMC 两路QSFP光纤收发子卡 一、板卡概述 本卡是一个FPGA夹层卡&#xff08;FMC&#xff09;模块&#xff0c;可提供高达2个QSFP / QSFP 模块接口&#xff0c;直接插入千兆位级收发器&#xff08;MGT&#xff09;的赛灵思FPGA。支持利用Spartan-6、Virtex-6、Kin…

Webpack看这篇就够了

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

java.sql.SQLException: Unknown system variable ‘query_cache_size‘【Pyspark】

1、问题描述 学习SparkSql中&#xff0c;将spark中dataframe数据结构保存为jdbc的格式并提交到本地的mysql中&#xff0c;相关代码见文章末尾。 运行代码时报出相关配置文件错误&#xff0c;如下。 根据该报错&#xff0c;发现网络上多数解决方都是基于java开发的解决方案&a…

GPT-4从0到1搭建一个Agent简介

GPT-4从0到1搭建一个Agent简介 1. 引言 在人工智能领域&#xff0c;Agent是一种能够感知环境并采取行动以实现特定目标的系统。本文将简单介绍如何基于GPT-4搭建一个Agent。 2. Agent的基本原理 Agent的核心是感知-行动循环&#xff08;Perception-Action Loop&#xff09;…

【Windows】系统盘空间不足?WizTree 和 DISM++ 来帮忙

当您的系统盘空间接近饱和时&#xff0c;了解硬盘空间的使用情况变得尤为重要。在这种情况下&#xff0c;您可以利用 Windows 内置的存储使用工具来快速查看哪些文件和应用程序占用了大量空间&#xff0c;并采取相应措施进行清理。此外&#xff0c;第三方工具如 WizTree 可以提…