Java多线程——性能与可伸缩性

可伸缩性

当增加计算资源时(如CPU、内存、存储容量或I/O带宽),程序的吞吐量或处理能力能相应的增加

Amdahl定理

F为必须被串行执行的部分,在N个处理器的机器中,在增加计算资源所能达到的最高加速比是

在这里插入图片描述
N趋于无穷大时,最大加速比趋于1/F,故串行部分是限制吞吐率的重要因素

线程引入的开销

上下文切换

切换过程中将保存当前运行线程的执行上下文,并将新调度进来的线程的执行上下文设置为当前上下文

内存同步

synchronized和volatile可能使用内存栅栏,其会刷新缓存,并可能抑制一些编译器优化操作

同步分为有竞争同步和无竞争同步,JVM会优化一些不会发生竞争的锁,如下

synchroized(new Object()){
}

当对象不会发布到堆,只会在栈中操作时,可以通过锁消除优化去掉加锁操作,如下Vector只会在栈上使用,可以消除add()加锁操作

public void testMethod() {
    Vector<String> vector = new Vector<>();
    vector.add("A");
    vector.add("B");
}

此外还可以进行锁粒度粗化,将临近的同步代码块用同一个锁合并起来,如上两个add()方法合并为单个锁的调用

阻塞

在锁上竞争时,失败的线程会阻塞,主要有两种阻塞方式

  • 自旋等待,循环不断获取锁直到成功
  • 通过操作系统挂起被阻塞的线程

减少锁的竞争

有两个因素影响锁上发生竞争的可能性

  • 锁的请求频率
  • 持有锁的时间

降低锁的竞争程度的方式有

  • 降低锁的请求频率
  • 减少锁的持有时间
  • 使用带有协调机制的独占锁

缩小锁的范围

可以减少持有锁时需要执行的指令数量

public class A {

    public synchronized void test() {

    }

    public void test2() {
        synchronized (this) {

        }
    }
}

锁分解

用多个独立的锁保护独立的变量

public class A {

    private final Set<String> man = new HashSet<>();
    private final Set<String> woman = new HashSet<>();

    public synchronized void addMan(String s) {
        man.add(s);
    }

    public synchronized void addWoman(String s) {
        woman.add(s);
    }

    public void addMan2(String s) {
        synchronized (man) {
            man.add(s);
        }
    }

    public void addWoman2(String s) {
        synchronized (woman) {
            woman.add(s);
        }
    }
}

锁分段

对一组独立对象上的锁进行分解。如ConcurrentHashMap使用一个包含16个锁的数组,每个锁保护散列桶的1/16,第N个散列桶由第N/16个锁来保护,这样能把锁的请求减少到原来的1/16

避免热点域

在集合的put和remove方法新增计数器记录集合的修改,在size方法返回时可以避免遍历集合,但会导致该计数器成为热点域,每个导致元素变化的操作都需要访问它,在同步时也会影响性能

为了避免上述问题,ConcurrentHashMap为每个分段都维护一个独立的计数器,并用分段的锁来维护,当调用size时将每个计数器相加

代替独占锁

  • ReadWriteLock:若读取操作不会修改共享资源则可以同时访问,但写入时必须以独占方式获取锁
  • 原子变量:提供了在整数或对象引用上的细粒度原子操作

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot 项目启动报错 “找不到或无法加载主类” 解决笔记

一、问题描述 在使用 IntelliJ IDEA 开发基于 Spring Boot 框架的 Java 程序时&#xff0c;原本项目能够正常启动。但在后续编写代码并重建项目后&#xff0c;再次尝试运行却出现了 “错误&#xff1a;找不到或无法加载主类 com.example.springboot.SpringbootApplication” 的…

snort3.0-ubuntu18.04 64入侵检测安装与使用

在日常生活中&#xff0c;很多人怀疑自己的手机、电脑被监控了&#xff0c;担心自己的隐私泄漏&#xff0c;实际上最佳的检测方式就是终端检测&#xff0c;也就是EDR&#xff0c;但是就是有那么多的人在网上大放厥词&#xff0c;说任何EDR杀毒软件都检测不到监控&#xff0c;毕…

Spring Cloud-Sentinel

Sentinel服务熔断与限流 Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量控制、流量路由、熔断降级、系统自适应保护等多个维度来帮助用户保障微服务的稳定性。 官网地址&#xff1a;home | Sentinelhttps://sen…

蓝桥与力扣刷题(230 二叉搜索树中第k小的元素)

题目&#xff1a;给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计一个算法查找其中第 k 小的元素&#xff08;从 1 开始计数&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,1,4,null,2], k 1 输出&#xff1a;1示例 2&#xff…

安卓设备调试h5页面(调试)

1、在chrome浏览器中输入网址&#xff1a;chrome://inspect/#devices 2、设备连接usb&#xff0c;打开对应app 3、点击inspect fallback&#xff0c;打开对应调试页面

第1章大型互联网公司的基础架构——1.6 RPC服务

你可能在1.1节的引言中注意到业务服务层包括HTTP服务和RPC服务&#xff0c;两者的定位不一样。一般来说&#xff0c;一个业务场景的核心逻辑都是在RPC服务中实现的&#xff0c;强调的是服务于后台系统内部&#xff0c;所谓的“微服务”主要指的就是RPC服务&#xff1b;而HTTP服…

【NLP251】BertTokenizer 的全部 API 及 使用案例

BertTokenizer 是 Hugging Face 的 transformers 库中用于处理 BERT 模型输入的分词器类。它基于 WordPiece 分词算法&#xff0c;能够将文本分割成词汇单元&#xff08;tokens&#xff09;&#xff0c;并将其转换为 BERT 模型可以理解的格式。BertTokenizer 是 BERT 模型的核心…

SOCKET建立简单的tcp服务端与客户端通信

socket是什么 socket可以使两台机子建立连接&#xff0c;就像连接风扇与电源的插座一样&#xff0c;socket可以使服务端与客户端建立连接&#xff0c;服务端就像供电厂&#xff0c;而客户端就像用电器&#xff0c;而socket就是连接二者的插座。 建立简单的连接 如果我们想在客…

机试刷题_字符串的排列【python】

题目&#xff1a;字符串的排列 from os import dup # # 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可 # # # param str string字符串 # return string字符串一维数组 # class Solution:def backtrack(self,res,state,choi…

PostgreSQL有undo表空间吗?

PostgreSQL有undo表空间吗 PostgreSQL 没有单独的 Undo 表空间&#xff0c;其事务回滚和多版本并发控制&#xff08;MVCC&#xff09;机制与 Oracle 等数据库有显著差异。 一 PostgreSQL 的 MVCC 实现 PostgreSQL 通过 多版本并发控制&#xff08;MVCC&#xff09; 管理事务…

CI/CD(二)docker-compose安装Jenkins

1、docker-compose.yml version: 3.8services:jenkins:image: jenkins/jenkins:lts # 使用官方的 Jenkins LTS 镜像container_name: jenkinsuser: root # 如果需要以 root 用户运行ports:- "8080:8080" # Jenkins Web 界面端口- "50000:50000" # 用于 Jen…

MySQL数据库(八)☞ 我是不是锁神

目录 1 全局锁的应用 2 索引对行锁的影响 3 表锁&#xff08;显式&#xff09;--表级锁 4 元数据锁 MDL(隐式)--表级锁 5 意向锁(Intention)--IS锁 IX锁--表级锁&#xff08;隐式&#xff09; 6 记录锁-(Record)-S锁 X锁 -- 行级锁 7 如何理解select ... lock in share …

rayTrace 采样

RayTrace in the rest of your life 蒙特卡洛积分 其大致内容大家可以自行去搜索&#xff0c;还是比较直观。上面的连接讲了不同的函数使用蒙特卡洛的例子 使用重要性采样 这里的重要性采样是通过pdf的值来决定的。这里有一个混淆点&#xff0c;一个是scatterPDF一个是Samp…

日常工作管理软件比较:6款工具的优缺点深度分析

本文介绍了6款广受欢迎的日常工作管理软件&#xff0c;包括&#xff1a;1. Worktile&#xff1b;2. Asana&#xff1b;3. Wrike&#xff1b;4. Teambition&#xff1b;5. Todoist&#xff1b;6. Notion。 在项目管理中&#xff0c;进度规划是确保项目按时完成的重要环节。无论是…

try learning-git-branching

文章目录 mergerebase分离 HEAD相对引用利用父节点branch -f 撤销变更cherry-pick交互式 rebase只取一个提交记录提交的技巧rebase 在上一次提交上amendcherry-pick 在上一次提交上 amend tag多分支 rebase两个parent节点纠缠不清的分支偏离的提交历史锁定的Main推送主分支合并…

「软件设计模式」单例模式(Singleton)

深入解析单例模式&#xff1a;从思想到C实战实现 一、设计模式与单例模式思想 1.1 设计模式的价值 设计模式是软件工程领域的经验结晶&#xff0c;如同建筑领域的经典蓝图。它们提供了经过验证的解决方案模板&#xff0c;能有效解决以下问题&#xff1a; 提高代码复用性提升…

ICRA-2025 | 具身导航如何跨越地形障碍?SARO:通过视觉语言模型实现地形穿越

作者&#xff1a;Shaoting Zhu, Derun Li, Linzhan Mou, Yong Liu, Ningyi Xu, Hang Zhao 单位&#xff1a;清华大学交叉信息研究院&#xff0c;上海交通大学电子信息与电气工程学院&#xff0c;浙江大学计算机科学与技术学院&#xff0c;宾夕法尼亚大学GRASP实验室&#xff0…

驱动开发、移植(最后的说法有误,以后会修正)

一、任务明确&#xff1a;把创龙MX8的驱动 按照我们的要求 然后移植到 我们的板子 1.Linux系统启动卡制作&#xff0c; sd卡 先按照 《用户手册—3-2-Linux系统启动卡制作及系统固化》 把创龙的Linux系统刷进去。 2. 把TLIMX8-EVM的板子过一遍 把刚刚烧好系统的sd卡插入 创…

免费deepseek的API获取教程及将API接入word或WPS中

免费deepseek的API获取教程: 1 https://cloud.siliconflow.cn/中注册时填写邀请码&#xff1a;GAejkK6X即可获取2000 万 Tokens; 2 按照图中步骤进行操作 将API接入word或WPS中 1 打开一个word&#xff0c;文件-选项-自定义功能区-勾选开发工具-左侧的信任中心-信任中心设置…

机器学习:k均值

所有代码和文档均在golitter/Decoding-ML-Top10: 使用 Python 优雅地实现机器学习十大经典算法。 (github.com)&#xff0c;欢迎查看。 在“无监督学习”中&#xff0c;训练样本的标记信息是未知的&#xff0c;目标是通过对无标记训练样本的学习来揭示数据的内在性质及规律&…