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

Java锁 从乐观锁和悲观锁开始讲 面试复盘

目录

面试复盘

Java 中的锁 大全

悲观锁

专业解释

自我理解

乐观锁

专业解释

自我理解

悲观锁的调用

乐观锁的调用

synchronized和 ReentrantLock的区别

相同点

区别

详细对比

总结


面试复盘

Java 中的锁 大全

悲观锁

专业解释

适合写操作多的场景

先加锁可以保证写操作时数据正确

显式的锁定之后再操作同步资源

自我理解

悲观锁认为自己使用数据的时候一定有其他线程来修改数据

因此在获取数据的时候会选择先加锁

确保数据不会被别的线程修改

synchronized 和 Lock 的实现类都是悲观锁

乐观锁

专业解释

适合读操作多的场景

不加锁的特点能够使其读操作的性能大幅提升

乐观锁则能直接去操作同步资源

是一种无锁算法

自我理解

乐观锁认为自己在操作数据的时候不会有别的线程修改数据,所以不会加锁,所以他只会在自己操作数据的时候检查是否有其他线程修改更新的这个数据。

如果乐观锁去操作数据,这个数据没有更新的话。当前线程会直接将修改成功的数据写入,如果数据已经被其他线程更新了。要通过不同的实现方式进行不同操作。乐观锁在Java中是通过使用无锁编程来实现的,常用的是CAS算法。

Java原子类中的递增操作就是用CAS 自旋完成的

悲观锁的调用

import java.util.concurrent.locks.ReentrantLock;public class OptiPessLockDemo {// 悲观锁的调用方式public  synchronized void m1(){// 加锁后的业务逻辑...}// 保证多个线程使用的是同一个lock对象的前提下ReentrantLock lock=new ReentrantLock();public void m2(){lock.lock();try {// 操作同步资源}finally {lock.unlock();}}// 两个都是悲观锁
}

假设在任何时候都可能发生冲突,因此,线程必须显式地获取锁以确保数据一致性和线程安全,直到它执行完毕并释放锁。

对于 synchronized,在方法级别加锁时,锁是针对该对象的,保证同一时刻只有一个线程能够执行该方法。因此,当一个线程在执行 m1() 方法时,其他线程不能同时执行同一个对象上的 m1() 方法。

  • synchronized 关键字的锁粒度是方法级别的,锁住的是整个方法。在方法执行期间,其他线程不能进入这个方法。
  • synchronized 实现的是隐式加锁和解锁,不需要显式地调用 lock()unlock()
  • ReentrantLock 是 Java 中的一个显式锁,它提供了比 synchronized 更细粒度的锁控制和更多功能。
  • ReentrantLock 通过 lock.lock() 显式地加锁,调用 lock.unlock() 来释放锁。通常,这两个操作会放在 try...finally 代码块中,以确保即使出现异常,锁也能得到释放。

乐观锁的调用

import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantLock;public class OptiPessLockDemo2 {// 乐观锁的调用方式private AtomicInteger atomicInteger = new AtomicInteger();atomicInteger.incrementAndGet();public static void main(String[] args) {int oldValue = atomicInteger.get();int newValue = oldValue + 1;// 如果值没有被修改,原子性操作成功return atomicInteger.compareAndSet(oldValue, newValue);}
}

这种方式在判断和更新之间,确保了只有一个线程能够成功更新值,其他线程则会重试或失败,从而保证了乐观锁的行为。

总之,乐观锁的核心是希望在操作时不加锁,直到最后验证冲突发生与否。如果有冲突,则可以通过重试、回滚等方式处理。

synchronizedReentrantLock的区别

synchronizedReentrantLock 都用于实现 悲观锁(Pessimistic Locking),即在多线程环境中对共享资源进行加锁,以保证线程安全。尽管两者实现的目标相同,它们在使用方式、灵活性、性能等方面有一些不同。下面我们来详细分析它们的 相同点区别

相同点

  1. 线程安全
    • 两者都能确保在多线程环境下,访问共享资源时,只有一个线程能够持有锁,防止多个线程同时修改共享数据,避免数据不一致。
  1. 互斥性
    • 两者都保证了同一时刻只有一个线程能够执行被保护的代码块或方法。其他线程必须等待当前线程释放锁后才能执行。
  1. 支持重入性
    • synchronizedReentrantLock 都是可重入的(Reentrant),即同一线程可以多次获取同一个锁,而不会发生死锁。
  1. 作用范围
    • 两者都可以应用于同步方法或同步代码块,保护共享资源。

区别

特性

synchronized

ReentrantLock

实现方式

隐式加锁,Java 编译器在编译时自动处理。

显式加锁,需要手动调用 lock()

unlock()

锁粒度

锁定整个方法或代码块,无法精确控制。

可以精确控制锁定的范围,允许更灵活的锁定操作。

性能

相对较低,特别是在高并发环境下,由于 JVM 的锁优化不足,可能导致性能瓶颈。

在高并发时,ReentrantLock

性能优于 synchronized

,尤其在锁竞争激烈时。

中断支持

不支持中断,线程获取锁时无法响应中断。

支持中断,可以使用 lockInterruptibly()

来在等待锁时响应中断。

公平性

非公平锁,线程不一定按照请求的顺序获取锁。

可以选择公平锁或非公平锁。使用构造函数 new ReentrantLock(true)

来创建公平锁。

死锁避免

需要小心死锁问题,synchronized

无法避免死锁。

通过 ReentrantLock

提供的 tryLock()

方法和超时机制可以更灵活地避免死锁。

锁释放机制

锁由 JVM 自动管理,方法执行完后自动释放。

必须手动调用 unlock()

释放锁,通常与 try...finally

语句配合使用。

可重入性

支持,可同一线程多次获取同一锁。

支持,可同一线程多次获取同一锁。

性能监控

无法直接获取锁的状态。

可以通过 getHoldCount()

获取当前线程持有锁的次数,进行监控。

锁升级

不支持锁的升级(无法从轻量级锁升级为重量级锁)。

可以通过锁的竞争情况动态升级为不同的锁类型(如偏向锁、轻量锁、重量锁)。


详细对比

  1. 锁的获取与释放
    • synchronized隐式加锁,锁的获取和释放是自动完成的。线程在执行被 synchronized 修饰的代码时,会自动获取该对象的锁,方法或代码块执行完后自动释放锁。
    • ReentrantLock显式加锁,必须手动调用 lock() 获取锁,必须手动调用 unlock() 释放锁。通常会配合 try...finally 语句使用,以保证在执行完业务逻辑后无论是否发生异常都能够释放锁。
  1. 中断响应
    • synchronized 在获取锁时无法响应中断。如果线程在等待锁的过程中被中断,它会继续等待,直到获取到锁。
    • ReentrantLock 提供了 lockInterruptibly() 方法,它允许在等待锁的过程中响应中断。线程在等待锁时,如果被中断,能够及时退出等待。
  1. 公平性
    • synchronized非公平锁,即任何线程在请求锁时,获取锁的顺序并不一定按照请求的顺序。可能先被调用的线程后获得锁,后调用的线程反而先获取到锁。
    • ReentrantLock 可以通过构造函数指定是否为 公平锁。如果设置为公平锁,锁会按照请求顺序分配给线程,先请求的线程会先获得锁。公平锁相对会增加一些性能开销,因此通常默认是非公平锁。
  1. 性能
    • 在低并发环境下,synchronized 的性能和 ReentrantLock 差不多,但在高并发环境下,ReentrantLock 会因为其灵活性和优化而表现得更好。
    • synchronized 锁的实现较为简单,但在高并发下可能存在 锁竞争 的问题,导致性能瓶颈。
    • ReentrantLock锁竞争 情况下提供了更多的优化方式,如通过自旋锁、CAS 等机制来减少线程的阻塞,从而提高性能。
  1. 死锁避免
    • synchronized 并没有提供直接的 API 来避免死锁。需要开发者自己通过代码设计来避免死锁问题。
    • ReentrantLock 提供了 tryLock() 方法,可以尝试获取锁,如果获取失败,可以选择放弃或重试。这种机制可以帮助开发者避免死锁或减少锁的等待时间。
  1. 锁的升级和监控
    • synchronized 锁的状态无法直接监控,只能通过 JVM 的内部调试工具进行查看。
    • ReentrantLock 提供了诸如 getHoldCount() 等方法来获取当前线程持有锁的次数,此外,还可以通过 getQueueLength() 来获取等待锁的线程数量,便于性能监控和分析。

总结

  • synchronized:适用于简单的同步需求,易于使用,代码简洁,但不够灵活,性能在高并发场景下可能有所下降。
  • ReentrantLock:功能更强大,提供了更多灵活性,如公平锁、中断响应、尝试加锁等,适用于复杂的多线程应用。但需要手动管理锁的获取与释放,使用上稍微复杂一些。

如果你的应用需求比较简单,且对性能要求不高,使用 synchronized 就足够了。如果你需要更多的控制、灵活性和对高并发场景的优化,ReentrantLock 会是更好的选择。

相关文章:

Java锁 从乐观锁和悲观锁开始讲 面试复盘

目录 面试复盘 Java 中的锁 大全 悲观锁 专业解释 自我理解 乐观锁 专业解释 自我理解 悲观锁的调用 乐观锁的调用 synchronized和 ReentrantLock的区别 相同点 区别 详细对比 总结 面试复盘 Java 中的锁 大全 悲观锁 专业解释 适合写操作多的场景 先加锁可以…...

【RabbitMq】RabbitMq高级特性-延迟消息

延迟消息 什么是延迟消息死信交换机延迟消息插件-DelayExchange其他文章 什么是延迟消息 延迟消息:发送者发送消息时指定一个时间,消费者不会立刻收到消息,而是在指定时间之后才收到消息。 延迟任务:设置在一定时间之后才执行的任…...

MindAgent:基于大型语言模型的多智能体协作基础设施

2023-09-18 ,加州大学洛杉矶分校(UCLA)、微软研究院、斯坦福大学等机构共同创建的新型基础设施,目的在评估大型语言模型在游戏互动中的规划和协调能力。MindAgent通过CuisineWorld这一新的游戏场景和相关基准,调度多智…...

Linux内存管理(Linux内存架构,malloc,slab的实现)

文章目录 前言一、Linux进程空间内存分配二、malloc的实现机理三、物理内存与虚拟内存1.物理内存2.虚拟内存 四、磁盘和物理内存区别五、页页的基本概念:分页管理的核心概念:Linux 中分页的实现:总结: 六、伙伴算法伙伴算法的核心…...

【机器学习实战中阶】比特币价格预测

比特币价格预测项目介绍 比特币价格预测项目是一个非常有实用价值的机器学习项目。随着区块链技术的快速发展,越来越多的数字货币如雨后春笋般涌现,尤其是比特币作为最早的加密货币,其价格波动备受全球投资者和研究者的关注。本项目的目标是…...

【JVM-9】Java性能调优利器:jmap工具使用指南与应用案例

在Java应用程序的性能调优和故障排查中,jmap(Java Memory Map)是一个不可或缺的工具。它可以帮助开发者分析Java堆内存的使用情况,生成堆转储文件(Heap Dump),并查看内存中的对象分布。无论是内…...

使用vscode在本地和远程服务器端运行和调试Python程序的方法总结

1 官网下载 下载网址:https://code.visualstudio.com/Download 如下图所示,可以分别下载Windows,Linux,macOS版本 历史版本下载链接: https://code.visualstudio.com/updates 2 安装Python扩展工具 打开 VS Code,安装 Microsoft 提供的官…...

AI 编程工具—Cursor 对话模式详解 Chat、Composer 与 Normal/Agent 模式

Cursor AI 对话模式详解:Chat、Composer 与 Normal/Agent 模式 一、简介 Cursor 是一个强大的 AI 辅助编程工具,它提供了多种对话模式来满足不同的开发需求。主要包括: Chat 模式:直接对话交互Composer 模式:结构化编程助手Normal/Agent 模式:不同的 AI 响应策略打开Ch…...

【MySQL】数据库基础知识

欢迎拜访:雾里看山-CSDN博客 本篇主题:【MySQL】数据库基础知识 发布时间:2025.1.21 隶属专栏:MySQL 目录 什么是数据库为什么要有数据库数据库的概念 主流数据库mysql的安装mysql登录使用一下mysql显示数据库内容创建一个数据库创…...

ChatGPT开发教程指南

ChatGPT开发教程指南 一、ChatGPT 概述二、开发环境搭建(一)硬件要求(二)软件要求 三、开发流程(一)数据处理(二)模型选择与训练(三)接口开发 四、示例代码 随…...

OpenEuler学习笔记(四):OpenEuler与CentOS的区别在那里?

OpenEuler与CentOS的对比 一、基本信息 起源与背景: OpenEuler:由华为发起,后捐赠给开放原子开源基金会,旨在构建一个开放、多元化的云计算和边缘计算平台,以满足华为及其他企业的硬件和软件需求。CentOS:…...

spring cloud如何实现负载均衡

在Spring Cloud中,实际上并没有直接支持lb:\\这样的URL前缀来自动解析为负载均衡的服务地址。lb:\\这样的表示可能是在某些特定框架、文档或示例中自定义的,但它并不是Spring Cloud官方API或规范的一部分。 Spring Cloud实现负载均衡的方式通常依赖于服…...

LeetCode:37. 解数独

跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:37. 解数独 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff…...

如何在idea中搭建SpringBoot项目

如何在idea中快速搭建SpringBoot项目 目录 如何在idea中快速搭建SpringBoot项目前言一、环境准备:搭建前的精心布局 1.下载jdk (1)安装JDK:(2)运行安装程序:(3)设置安装…...

STM32补充——FLASH

目录 1.内部FLASH构成(F1) 2.FLASH读写过程(F1) 2.1内存的读取 2.2闪存的写入 2.3FLASH接口寄存器(写入 & 擦除相关) 3.FLASH相关HAL库函数简介(F1/F4/F7/H7) 4.编程实战 …...

ASP.NET Core 中的 JWT 鉴权实现

在当今的软件开发中,安全性和用户认证是至关重要的方面。JSON Web Token(JWT)作为一种流行的身份验证机制,因其简洁性和无状态特性而被广泛应用于各种应用中,尤其是在 ASP.NET Core 项目里。本文将详细介绍如何在 ASP.…...

Docker配置国内镜像源

访问docker hub需要科学上网 在 Docker 中配置镜像地址(即镜像加速器)可以显著提升拉取镜像的速度,尤其是在国内访问 Docker Hub 时。以下是详细的配置方法: 1. 配置镜像加速器 Docker 支持通过修改配置文件来添加镜像加速器地址…...

qiankun+vite+vue3

基座与子应用代码示例 本示例中,基座为Vue3,子应用也是Vue3,由于qiankun不支持Vite构建的项目,这里还要引入 vite-plugin-qiankun 插件 基座(主应用) 加载qiankun依赖 npm i qiankun -S qiankun配置(src/qiankun) src/qiankun/config.ts export default {subApp…...

如何使用AI工具cursor(内置ChatGPT 4o+claude-3.5)

⚠️温馨提示: 禁止商业用途,请支持正版,充值使用,尊重知识产权! 免责声明: 1、本教程仅用于学习和研究使用,不得用于商业或非法行为。 2、请遵守Cursor的服务条款以及相关法律法规。 3、本…...

Linux内核编程(二十一)USB驱动开发-键盘驱动

一、驱动类型 USB 驱动开发主要分为两种:主机侧的驱动程序和设备侧的驱动程序。一般我们编写的都是主机侧的USB驱动程序。 主机侧驱动程序用于控制插入到主机中的 USB 设备,而设备侧驱动程序则负责控制 USB 设备如何与主机通信。由于设备侧驱动程序通常与…...

vue3+ts watch 整理

watch() 一共可以接受三个参数,侦听数据源、回调函数和配置选项 作用:监视数据的变化(和Vue2中的watch作用一致) 特点:Vue3中的watch只能监视以下四种数据: ref定义的数据。 reactive定义的数据。 函数返…...

2025年最新深度学习环境搭建:Win11+ cuDNN + CUDA + Pytorch +深度学习环境配置保姆级教程

本文目录 一、查看驱动版本1.1 查看显卡驱动1.2 显卡驱动和CUDA对应版本1.3 Pytorch和Python对应的版本1.4 Pytorch和CUDA对应的版本 二、安装CUDA三、安装cuDANN四、安装pytorch五、验证是否安装成功 一、查看驱动版本 1.1 查看显卡驱动 输入命令nvidia-smi可以查看对应的驱…...

USART_串口通讯轮询案例(HAL库实现)

引言 前面讲述的串口通讯案例是使用寄存器方式实现的,有利于深入理解串口通讯底层原理,但其开发效率较低;对此,我们这里再讲基于HAL库实现的串口通讯轮询案例,实现高效开发。当然,本次案例需求仍然和前面寄…...

CAN 网络介绍

背景 在T-Box 产品开发过程中,我们离不开CAN总线,因为CAN总线为我们提供了车身的相关数据,比如,车速、油耗、温度等。用于上报TSP平台,进行国标认证;也帮助我们进行车身控制,比如车门解锁/闭锁…...

pytorch 多机多卡训练方法

在深度学习训练中,使用多机多卡(多台机器和多块 GPU)可以显著加速模型训练过程。 PyTorch 提供了多种方法来实现多机多卡训练,以下是一些常用的方法和步骤: 1. 使用 torch.distributed 包 PyTorch 的 torch.distribut…...

【智能控制】年末总结,模糊控制,神经网络控制,专家控制,遗传算法

关注作者了解更多 我的其他CSDN专栏 毕业设计 求职面试 大学英语 过程控制系统 工程测试技术 虚拟仪器技术 可编程控制器 工业现场总线 数字图像处理 智能控制 传感器技术 嵌入式系统 复变函数与积分变换 单片机原理 线性代数 大学物理 热工与工程流体力学 …...

Linux系统 C/C++编程基础——使用make工具和Makefile实现自动编译

ℹ️大家好,我是练小杰,今天周二了,距离除夕只有6天了,新的一年就快到了😆 本文是有关Linux C/C编程的make和Makefile实现自动编译相关知识点,后续会不断添加相关内容 ~~ 回顾:【Emacs编辑器、G…...

kafka学习笔记7 性能测试 —— 筑梦之路

kafka 不同的参数配置对 kafka 性能都会造成影响,通常情况下集群性能受分区、磁盘和线程等影响因素,因此需要进行性能测试,找出集群性能瓶颈和最佳参数。 # 生产者和消费者的性能测试工具 kafka-producer-perf-test.sh kafka-consumer-perf-t…...

C#与AI的共同发展

C#与人工智能(AI)的共同发展反映了编程语言随着技术进步而演变,以适应新的挑战和需要。自2000年微软推出C#以来,这门语言经历了多次迭代,不仅成为了.NET平台的主要编程语言之一,还逐渐成为构建各种类型应用程序的强大工具。随着时…...

multus使用教程

操作步骤如下: 1.在vmware vsphere上配置所有主机使用的端口组安全项 Forged transmits 设置为: Accept Promiscuous Mode 设置为:Accept Promiscuous Mode(混杂模式)和Forged Transmits(伪传输&#xff09…...

用JAVA写算法之输入输出篇

本系列适合原来用C语言或其他语言写算法,但是因为找工作或比赛的原因改用JAVA语言写算法的同学。当然也同样适合初学算法,想用JAVA来写算法题的同学。 常规方法:使用Scanner类和System.out 这种方法适用于leetcode,以及一些面试手…...

场馆预定平台高并发时间段预定实现V2

🎯 本文档介绍了场馆预订系统接口V2的设计与实现,旨在解决V1版本中库存数据不一致及性能瓶颈的问题。通过引入令牌机制确保缓存和数据库库存的最终一致性,避免因服务器故障导致的库存错误占用问题。同时,采用消息队列异步处理库存…...

(1)STM32 USB设备开发-基础知识

开篇感谢: 【经验分享】STM32 USB相关知识扫盲 - STM32团队 ST意法半导体中文论坛 单片机学习记录_桃成蹊2.0的博客-CSDN博客 USB_不吃鱼的猫丿的博客-CSDN博客 1、USB鼠标_哔哩哔哩_bilibili usb_冰糖葫的博客-CSDN博客 USB_lqonlylove的博客-CSDN博客 USB …...

Spring Boot 整合 ShedLock 处理定时任务重复执行的问题

🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Micro麦可乐的博客 🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战 🌺《RabbitMQ》…...

缓存之美:万文详解 Caffeine 实现原理(上)

由于社区最大字数限制,本文章将分为两篇,第二篇文章为缓存之美:万文详解 Caffeine 实现原理(下) 大家好,我是 方圆。文章将采用“总-分-总”的结构对配置固定大小元素驱逐策略的 Caffeine 缓存进行介绍&…...

PHP语言的网络编程

PHP语言的网络编程 网络编程是现代软件开发中不可或缺的一部分,尤其是在日益发展的互联网时代。PHP(Hypertext Preprocessor)是一种广泛使用的开源脚本语言,专门用于Web开发。它的灵活性、易用性以及强大的社区支持使得PHP在网络…...

【技巧】优雅的使用 pnpm+Monorepo 单体仓库构建一个高效、灵活的多项目架构

单体仓库(Monorepo)搭建指南:从零开始 单体仓库(Monorepo)是一种将多个相关项目集中管理在一个仓库中的开发模式。它可以帮助开发者共享代码、统一配置,并简化依赖管理。本文将通过实际代码示例&#xff0…...

算法项目实时推流

1、搭建流媒体服务器 下载mediamtx 2、视频流直推 ffmpeg -stream_loop -1 -i DJI_20250109112715_0002_W.MP4 -r 30 -c:v libx264 -preset ultrafast -f flv rtmp://192.168.100.20:1935/live/test_chengdu1 3、硬件加速 如果硬件支持,可以使用硬件加速编码器&am…...

软件测试—— 接口测试(HTTP和HTTPS)

软件测试—— 接口测试(HTTP和HTTPS) HTTP请求方法GET特点使用场景URL结构URL组成部分URL编码总结 POST特点使用场景请求结构示例 请求标头和响应标头请求标头(Request Headers)示例请求标头 响应标头(Response Header…...

PCL K4PCS算法实现点云粗配准【2025最新版】

目录 一、算法原理1、算法概述2、算法流程3、参考文献二、 代码实现1、原始版本2、2024新版三、 结果展示本文由CSDN点云侠原创,原文链接,首发于:2020年4月27日。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的抄袭狗。 博客长期更新,本文最近一次更新时间为…...

Docker 学习总结(85)—— docker cp 使用总结

前言 在现代软件开发中,Docker 已成为一种流行的容器化技术。无论是在开发、测试还是生产环境中,管理容器内的文件都是一项常见且重要的任务。本文将详细介绍如何使用 docker cp 命令在 Docker 容器与宿主机之间拷贝文件和目录,并结合一些实际使用场景,帮助您更高效地管理…...

《FMambaIR:一种基于混合状态空间模型和频域的方法用于图像恢复》学习笔记

paper:(PDF) FMambaIR: A Hybrid State Space Model and Frequency Domain for Image Restoration 目录 摘要 一、引言 二、相关工作 1、图像恢复 2、频率学习 3、状态空间模型(SSM) 三、框架 1、基本知识 2、整体框架 3、F-Mamba…...

PyQt5 超详细入门级教程上篇

PyQt5 超详细入门级教程 上篇:1-3部分:PyQt5基础与常用控件 第1部分:初识 PyQt5 和安装 1.1 什么是 PyQt5? PyQt5 是 Python 的图形用户界面 (GUI) 框架,它基于强大的 Qt 库。Qt 是一个跨平台的 C 框架,用…...

通信协议—WebSocket

一、WebSocket编程概念 1.1 什么是WebSocket WebSocket 是一种全双工通信协议,允许在客户端(通常是浏览器)和服务器之间建立持久连接,以实现实时的双向通信。它是 HTML5 标准的一部分,相比传统的 HTTP 请求&#xff…...

FFmpeg音视频采集

文章目录 音视频采集音频采集获取设备信息录制麦克风录制声卡 视频采集摄像机画面采集 音视频采集 DirectShow(简称DShow)是一个Windows平台上的流媒体框架,提供了高质量的多媒体流采集和回放功能,它支持多种多样的媒体文件格式&…...

【微机原理与接口技术】定时控制接口

文章目录 8253的引脚和工作方式内部结构和引脚工作方式方式0:计数结束中断方式1:可编程单稳脉冲方式2:周期性负脉冲输出方式3:方波发生器方式4:软件触发的单次负脉冲输出方式5:硬件触发的单次负脉冲输出各种…...

AG32 FPGA 的 Block RAM 资源:M9K 使用

1. 概述 AG32 FPGA 包含了 4 个 M9K 块,每个 M9K 块的容量为 8192 bits,总计为 4 个 M9K(4K bytes)。这使得 AG32 的内部存储非常适合嵌入式应用,能够有效地利用片上资源。 M9K 参数 参考自《AGRV2K_Rev2.0.pdf》。…...

第3天:阿里巴巴微服务解决方案概览

一、阿里巴巴微服务解决方案概述 阿里巴巴在微服务领域贡献了多个开源项目,形成了完整的微服务解决方案,广泛应用于分布式系统开发。其中,Spring Cloud Alibaba 是基于 Spring Cloud 构建的一站式微服务解决方案,集成了多个阿里巴…...

在Ubuntu上安装RabbitMQ教程

1、安装erlang 因为rabbitmq是基于erlang开发的,所以要安装rabbitmq,首先需要安装erlang运行环境 apt-get install erlang执行命令查是否安装成功:erl,疯狂 Ctrlc 就能退出命令行 2、安装rabbitmq 1、查看erlang与rabbitmq版本…...

WPF 引发类型为“System.Windows.Forms.AxHost+InvalidActiveXStateException”的异常 解决办法

本章讲述:引发类型为“System.Windows.Forms.AxHostInvalidActiveXStateException”的异常 解决办法。 这几天在做一个WPF功能时,因为引用了第三方的OCX控件,一般来说一个对象只要实例化就行了, 但是在引用这个控件时就报引发类型为“System.…...