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

Java 有哪些锁,他们的区别是什么

Java 锁的分类

Java 中的锁可以从多个维度进行分类:

  • 悲观锁 vs. 乐观锁
  • 公平锁 vs. 非公平锁
  • 独占锁 (互斥锁) vs. 共享锁 (读写锁)
  • 可重入锁 vs. 不可重入锁
  • 自旋锁
  • 偏向锁 vs. 轻量级锁 vs. 重量级锁 (JVM 锁优化)

1. synchronized 关键字:

  • 类型: 悲观锁,非公平锁,独占锁,可重入锁

  • 特点:

    • 内置锁: 由 JVM 提供,使用简单,隐式加锁和释放锁。
    • 互斥性: 保证同一时刻只有一个线程可以执行被 synchronized 修饰的代码块。
    • 可见性: 确保在释放锁之前,对共享变量的修改对其他线程可见。
    • 可重入性: 允许同一个线程多次获取同一个锁。
    • 非公平性: 线程获取锁的顺序是不确定的,可能导致某些线程长时间无法获取锁(饥饿)。
    • 自动释放: 无论正常执行完成还是抛出异常,锁都会自动释放。
  • 适用场景: 简单的同步场景,代码量少,竞争不激烈的场景。

  • 示例代码:

    public class SynchronizedExample {private int count = 0;// 修饰方法public synchronized void increment() {count++;}// 修饰代码块public void incrementBlock() {synchronized (this) {count++;}}public int getCount() {return count;}public static void main(String[] args) throws InterruptedException {SynchronizedExample example = new SynchronizedExample();Thread thread1 = new Thread(() -> {for (int i = 0; i < 10000; i++) {example.increment();}});Thread thread2 = new Thread(() -> {for (int i = 0; i < 10000; i++) {example.increment();}});thread1.start();thread2.start();thread1.join();thread2.join();System.out.println("Count: " + example.getCount()); // 结果一定是20000}
    }
    

2. Lock 接口及其实现类:

  • 类型: 悲观锁,可配置公平性,独占锁/共享锁,可重入锁

  • 特点:

    • 手动加锁/解锁: 需要显式调用 lock()unlock() 方法,灵活性更高。

    • 可中断: 可以使用 lockInterruptibly() 方法响应中断,避免线程长时间等待。

    • 可轮询: 可以使用 tryLock() 方法尝试获取锁,如果获取不到立即返回,避免阻塞。

    • 公平性选择: 可以创建公平锁,按照请求顺序获取锁,避免饥饿。

    • 多种实现: 提供了 ReentrantLock(可重入互斥锁)和 ReentrantReadWriteLock(可重入读写锁)等实现。

  • 适用场景: 需要更灵活的锁控制、可中断、可轮询、公平锁等场景。

  • 示例代码(ReentrantLock):

    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;public class ReentrantLockExample {private int count = 0;private Lock lock = new ReentrantLock();public void increment() {lock.lock(); // 加锁try {count++;} finally {lock.unlock(); // 必须在 finally 中释放锁,确保锁一定会被释放}}public int getCount() {return count;}public static void main(String[] args) throws InterruptedException {ReentrantLockExample example = new ReentrantLockExample();Thread thread1 = new Thread(() -> {for (int i = 0; i < 10000; i++) {example.increment();}});Thread thread2 = new Thread(() -> {for (int i = 0; i < 10000; i++) {example.increment();}});thread1.start();thread2.start();thread1.join();thread2.join();System.out.println("Count: " + example.getCount()); // 结果一定是20000}
    }
    

3. ReadWriteLock 接口及其实现类(ReentrantReadWriteLock):

  • 类型: 悲观锁,可配置公平性,共享锁(读锁)/独占锁(写锁),可重入锁

  • 特点:

    • 读写分离: 允许多个线程同时读取共享资源(读锁),但只允许一个线程写入共享资源(写锁)。

    • 读读共享: 多个线程可以同时持有读锁。

    • 读写互斥/写写互斥: 读锁和写锁、写锁和写锁之间互斥。

    • 提升并发性能: 适用于读多写少的场景,提高并发性能。

  • 适用场景: 读多写少的场景,例如缓存、配置文件、大型数据结构的读取等。

  • 示例代码:

    import java.util.concurrent.locks.ReadWriteLock;
    import java.util.concurrent.locks.ReentrantReadWriteLock;public class ReadWriteLockExample {private int count = 0;private ReadWriteLock rwLock = new ReentrantReadWriteLock();public int getCount() {rwLock.readLock().lock(); // 获取读锁try {return count;} finally {rwLock.readLock().unlock(); // 释放读锁}}public void increment() {rwLock.writeLock().lock(); // 获取写锁try {count++;} finally {rwLock.writeLock().unlock(); // 释放写锁}}public static void main(String[] args) throws InterruptedException {ReadWriteLockExample example = new ReadWriteLockExample();Thread thread1 = new Thread(() -> {for (int i = 0; i < 10000; i++) {example.increment();}});Thread thread2 = new Thread(() -> {for (int i = 0; i < 10000; i++) {example.increment();}});Thread thread3 = new Thread(() -> {for (int i = 0; i < 1000; i++) {System.out.println("Count: " + example.getCount()); // 多个线程同时读}});thread1.start();thread2.start();thread3.start();thread1.join();thread2.join();thread3.join();System.out.println("Final Count: " + example.getCount()); // 结果一定是20000}
    }
    

4. StampedLock (Java 8):

  • 类型: 乐观锁/悲观锁,非公平锁,共享锁/独占锁,不可重入锁

  • 特点:

    • 更灵活的读写锁: 提供了三种模式:写锁、悲观读锁和乐观读。

    • 乐观读: 允许在没有写锁的情况下进行读取,但需要在读取完成后验证数据是否被修改过,如果被修改过则需要重试。

    • 避免锁饥饿: 支持读锁升级为写锁。

    • 不可重入: 不支持重入。

  • 适用场景: 读多写少的场景,且对性能要求极高,可以容忍一定的重试开销。

  • 示例代码:

    import java.util.concurrent.locks.StampedLock;public class StampedLockExample {private int count = 0;private final StampedLock stampedLock = new StampedLock();public int getCount() {long stamp = stampedLock.tryOptimisticRead(); // 尝试乐观读int currentCount = count;if (!stampedLock.validate(stamp)) { // 检查读取过程中是否有写操作stamp = stampedLock.readLock(); // 如果有写操作,则升级为悲观读try {currentCount = count;} finally {stampedLock.unlockRead(stamp);}}return currentCount;}public void increment() {long stamp = stampedLock.writeLock(); // 获取写锁try {count++;} finally {stampedLock.unlockWrite(stamp); // 释放写锁}}public static void main(String[] args) throws InterruptedException {StampedLockExample example = new StampedLockExample();Thread thread1 = new Thread(() -> {for (int i = 0; i < 10000; i++) {example.increment();}});Thread thread2 = new Thread(() -> {for (int i = 0; i < 10000; i++) {example.increment();}});Thread thread3 = new Thread(() -> {for (int i = 0; i < 1000; i++) {System.out.println("Count: " + example.getCount()); // 多个线程同时乐观读}});thread1.start();thread2.start();thread3.start();thread1.join();thread2.join();thread3.join();System.out.println("Final Count: " + example.getCount()); // 结果一定是20000}
    }
    

5. 锁优化(JVM 层面):

  • 偏向锁: 适用于只有一个线程访问同步代码块的场景,消除不必要的锁竞争。
  • 轻量级锁: 适用于多个线程交替访问同步代码块的场景,避免使用重量级锁。
  • 自旋锁: 当线程尝试获取锁时,如果锁已经被占用,则线程不会立即阻塞,而是循环尝试获取锁,避免线程切换的开销。

锁的选择建议:

  • 简单场景: 优先考虑 synchronized 关键字。
  • 需要更多控制: 使用 ReentrantLock
  • 读多写少: 使用 ReentrantReadWriteLockStampedLock
  • 性能极致要求: 评估 StampedLock 的适用性,并进行充分测试。
  • 避免长时间持有锁: 尽量缩小锁的范围,减少锁的持有时间,提高并发性能。
  • 注意死锁: 避免循环依赖,保证锁的释放。

锁的区别总结:

特性synchronizedReentrantLockReentrantReadWriteLockStampedLock
类型内置锁Lock 接口ReadWriteLock 接口
加锁方式隐式显式显式显式
释放方式自动手动手动手动
公平性非公平可配置可配置非公平
可重入性支持支持支持不支持
读写分离不支持不支持支持支持 (乐观读)
中断等待不支持支持支持不支持
性能一般较好读多写少时性能好极致性能 (但需重试)
使用复杂度简单复杂复杂复杂

注意事项:

  • 死锁: 避免循环依赖的锁获取顺序,确保锁的释放。

  • 性能测试: 在选择锁时,进行性能测试,验证锁的性能是否满足需求。

  • 代码规范: 遵循代码规范,正确使用锁机制,避免出现并发问题。

相关文章:

Java 有哪些锁,他们的区别是什么

Java 锁的分类 Java 中的锁可以从多个维度进行分类&#xff1a; 悲观锁 vs. 乐观锁公平锁 vs. 非公平锁独占锁 (互斥锁) vs. 共享锁 (读写锁)可重入锁 vs. 不可重入锁自旋锁偏向锁 vs. 轻量级锁 vs. 重量级锁 (JVM 锁优化) 1. synchronized 关键字&#xff1a; 类型: 悲观锁…...

CSS实现单行、多行文本溢出显示省略号(…)

在网页设计中&#xff0c;我们常常遇到这样的情况&#xff1a;文本内容太长&#xff0c;无法完全显示在一个固定的区域内。为了让界面看起来更整洁&#xff0c;我们可以使用省略号&#xff08;…&#xff09;来表示内容溢出。这不仅能提升用户体验&#xff0c;还能避免内容溢出…...

网络协议/MQTT Paho.MQTT客户端库接口基础知识

开源c版mqtt客户端:https://github.com/eclipse-paho/paho.mqtt.cMQTT 客户端与服务器之间支持的通信协议主要包括: 协议地址格式加密默认端口适用场景服务器地址示例TCPtcp://不加密1883局域网或对安全性要求不高的场景tcp://localhost:1883TLS/SSLssl://加密8883对安全性要…...

VSCode C/C++ 开发环境完整配置及常见问题(自用)

这里主要记录了一些与配置相关的内容。由于网上教程众多&#xff0c;部分解决方法并不能完全契合我遇到的问题&#xff0c;因此我选择以自己偏好的方式&#xff0c;对 VSCode 进行完整的配置&#xff0c;并记录在使用过程中遇到的问题及解决方案。后续内容也会持续更新和完善。…...

深入解析 Go 中的 `io.Pipe()`:实现高效的并发通信

在 Go 语言中&#xff0c;io.Pipe() 是一个强大且灵活的工具&#xff0c;用于在不同的 goroutine 之间实现高效的同步和通信。它通过创建一对连接的 I/O 流&#xff0c;允许数据在管道的两端安全地传递。本文将详细介绍 io.Pipe() 的工作原理、主要特点、使用方法以及一些实际应…...

【Kubernetes】常用命令全解析:从入门到实战(中)

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Kubernetes航线图&#xff1a;从船长到K8s掌舵者》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、什么是k8s 2、K8s的核心功能 二、资…...

嵌入式八股文面试题(二)C语言算法

相关概念请查看文章&#xff1a;C语言概念。 1. 如何实现一个简单的内存池&#xff1f; 简单实现&#xff1a; #include <stdio.h> #include <stdlib.h>//内存块 typedef struct MemoryBlock {void *data; // 内存块起始地址struct MemoryBlock *next; // 下一个内…...

Proxmox VE 8.3 qm 方式导入ESXi Linux OVA UEFI模式虚拟机

前言 实现esxi ova uefi 虚拟机导入到pve,Linux UEFI 都支持 创建一个105虚拟机 qm 参数使用参考,以下可以根据自己的实际情况执行调整 esxi 导出虚拟机参考 #vmid (100 - 999999999) vmid=105# qm vm name...

人工智能浪潮下脑力劳动的变革与重塑:挑战、机遇与应对策略

一、引言 1.1 研究背景与意义 近年来&#xff0c;人工智能技术发展迅猛&#xff0c;已成为全球科技领域的焦点。从图像识别、语音识别到自然语言处理&#xff0c;从智能家居、智能交通到智能医疗&#xff0c;人工智能技术的应用几乎涵盖了我们生活的方方面面&#xff0c;给人…...

【线性代数】1行列式

1. 行列式的概念 行列式的符号表示: 行列式的计算结果:一个数 计算模型1:二阶行列式 二阶行列式: 三阶行列式: n阶行列式: 🍎计算行列式 计算模型2:上三角形行列式 上三角形行列式特征:主对角线下皆为0。 上三角形行列式: 化上三角形通用方法:主对角线下,…...

厘米和磅的转换关系

在排版和设计领域&#xff0c;厘米&#xff08;cm&#xff09;和磅&#xff08;pt&#xff09;都是常用的长度度量单位&#xff0c;它们之间的转换关系基于特定的换算标准&#xff0c;下面为你详细介绍&#xff1a; 基本换算关系 磅是印刷行业常用的长度单位&#xff0c;1英寸…...

vant4 van-list组件的使用

<van-listv-if"joblist && joblist.length > 0"v-model:loading"loading":finished"finished":immediate-check"false"finished-text"没有更多了"load"onLoad">// 加载 const loading ref(fals…...

QT 异步编程之多线程

一、概述 1、在进行桌面应用程序开发的时候&#xff0c;假设应用程序在某些情况下需要处理比较复制的逻辑&#xff0c;如果只有一个线程去处理&#xff0c;就会导致窗口卡顿&#xff0c;无法处理用户的相关操作。这种情况下就需要使用多线程&#xff0c;其中一个线程处理窗口事…...

HCIA项目实践---OSPF的知识和原理总结

9.5 OSPF 9.5.1 从哪些角度评判一个动态路由协议的好坏&#xff1f; &#xff08;1&#xff09;选路佳&#xff08;是否会出环&#xff09; OSPF 协议采用链路状态算法&#xff0c;通过收集网络拓扑信息来计算最短路径&#xff0c;从根本上避免了路由环路的产生。 &#xff08…...

DNS污染:网络世界的“隐形劫持”与防御

在互联网的底层架构中&#xff0c;DNS&#xff08;域名系统&#xff09;如同数字世界的“导航员”&#xff0c;将用户输入的域名翻译成机器可读的IP地址。然而&#xff0c;DNS污染&#xff08;DNS Poisoning&#xff09;正像一场无声的“地址篡改”危机&#xff0c;威胁着全球网…...

Unity Shader Feature

Shader Feature 设置Keyword //0:Red 1:Green 2:Blue Mat.SetInt(“_Color”,0); 需要在创建时进行设置&#xff0c;运行时不可设置 Shader "Unlit/KeywordEnum" {Properties{[KeywordEnum(Red,Green,Blue)] _Color("Color",int) 0}SubShader{Pass{HLSL…...

Java-数据结构-栈与队列(常考面试题与单调栈)

在上一篇的学习中&#xff0c;我们学习了栈和队列的基本知识&#xff0c;以及它们对应都有哪些方法&#xff0c;在什么应用场景下如何使用&#xff0c;并且还对它们进行了模拟实现&#xff0c;而其实对于栈和队列的相关知识还远不止于此&#xff0c;而今天我们就对栈与队列进行…...

Python Pandas(11):Pandas 数据可视化

数据可视化是数据分析中的重要环节&#xff0c;它帮助我们更好地理解和解释数据的模式、趋势和关系。通过图形、图表等形式&#xff0c;数据可视化将复杂的数字和统计信息转化为易于理解的图像&#xff0c;从而便于做出决策。Pandas 提供了与 Matplotlib 和 Seaborn 等可视化库…...

wordpress模板文件结构超详解

wordpress网站建设中&#xff0c;主题的制作是最为核心的环节。了解模板文件结构是模板制作的第一步&#xff0c;本文所讲的模板文件结构包括两部分&#xff0c;一是指以文件名为概念的文件结构&#xff0c;二是指文件内容的代码结构。 一、如何使模板文件起作用 ↑ wordpres…...

大脑神经网络与机器神经网络的区别

大脑神经网络(生物神经网络)与机器神经网络(人工神经网络,ANN)虽然名称相似,但在结构、功能、学习机制等方面存在显著差异。以下是两者的主要区别: 1. 基础结构与组成 大脑神经网络: 由 生物神经元(约860亿个)通过突触连接形成动态网络。 神经元通过电化学信号(动作…...

【H5自适应】高端科技类pbootcms网站模板 – 三级栏目、下载与招聘功能支持

(H5自适应)高端大气的科技类pbootcms网站模板 带三级栏目、下载和招聘功能 后台地址&#xff1a;您的域名/admin.php 后台账号&#xff1a;admin 后台密码&#xff1a;123456 为了提升系统安全&#xff0c;请将后台文件admin.php的文件名修改一下。修改之后&#xff0c;后台…...

SQL-leetcode—1661. 每台机器的进程平均运行时间

1661. 每台机器的进程平均运行时间 表: Activity ----------------------- | Column Name | Type | ----------------------- | machine_id | int | | process_id | int | | activity_type | enum | | timestamp | float | ----------------------- 该表展示了一家工厂网站的…...

C++ Primer 跳转语句

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…...

清华大学:DeepSeek 如何赋能职场应用(35 页 PDF)

原来已经分享过清华大学的 DeepSeek&#xff1a;从入门到精通&#xff08;100页PDF&#xff09; 现在又来第二弹&#xff1a;《DeepSeek 如何赋能职场应用&#xff1f;从提示语技巧到多场景应用》 PDF里介绍了 DeepSeek 这一人工智能工具及其在职场中的应用&#xff0c;从基础…...

idea 错误: 找不到或无法加载主类 @C:\Users\admin\AppData\Local\Temp\idea_arg_file1549212448

idea 错误: 找不到或无法加载主类 C:\Users\admin\AppData\Local\Temp\idea_arg_file1549212448 该错误往往和左下角爱弹出的如下提示是一个意思 Error running ‘PayV3Test1.testTransferBatchesBatchId’ Error running PayV3Test1.testTransferBatchesBatchId. Command lin…...

开发指南098-logback-spring.xml说明

可执行的工程src\main\resources目录有logback-spring.xml文件用于配置日志。配置日志有些容易犯晕的地方&#xff0c;这里列出&#xff1a; 1、<logger>标签的优先级高于<root>标签‌&#xff1a;所以&#xff0c;如果<logger>标签指定了某个具体的包或类的…...

【SpringBoot3.x+】slf4j-log4j12依赖引入打印日志报错的两种解决方法

最开始引入了1.7.5版本的slf4j-log4j依赖包&#xff0c;但是控制台不报错也不显示日志 在https://mvnrepository.com/找到最新的2.0.16版本之后出现报错&#xff1a; 进入提示的slf4j网站中可以找到从2.0.0版本开始&#xff0c;slf4j-log4j已经被slf4j-reload4j取代&#xff1…...

【STM32】H743的以太网MAC控制器的一个特殊功能

调试743的MAC&#xff0c;翻阅手册的时候&#xff0c;发现了一个有意思的功能 混杂模式 H743的MAC控制器&#xff0c;可以设置为混杂模式&#xff0c;这就意味着它可以做一些网络监控的应用&#xff0c;譬如连接具备端口镜像功能的交换机&#xff0c;然后直接代替PC实现网络数据…...

Java LinkedList(单列集合)

LinkedList 是 Java 中实现了 List 接口的一个类&#xff0c;它属于 java.util 包。与 ArrayList 不同&#xff0c;LinkedList 是基于双向链表实现的&#xff0c;适合于频繁进行插入和删除操作的场景。 1. LinkedList 的基本特性 基于链表实现&#xff1a;LinkedList 使用双向…...

docker compose快速部署kafka-connect集群

先部署kafka集群&#xff0c;启动 参考&#xff1a;docker compose部署kafka集群-CSDN博客 创建timezone文件&#xff0c;内容填写Asia/Shanghai 再部署kafka-connect集群 networks: net: external: true services: kafka-connect1: restart: always image:…...

docker 部署nginx,nginx 504

遇到问题 原因&#xff1a; 因为用的docker 部署nginx, docker 应用与服务之间的端口未开放&#xff0c;导致访问不到服务。...

RealClip正式发布:重新定义轻量化数字内容交互体验

在移动互联网流量红利逐渐见顶的当下&#xff0c;用户对即时性、碎片化娱乐与交互体验的需求持续攀升。轻量化小游戏、VR互动、数字孪生、工业仿真等内容形态迅速崛起&#xff0c;但开发者却面临两大核心矛盾&#xff1a;如何将高性能互动内容轻量化嵌入现有应用中&#xff1f;…...

SQLMesh系列教程-2:SQLMesh入门项目实战(上篇)

假设你已经了解SQLMesh是什么&#xff0c;以及其他应用场景。如果没有&#xff0c;我建议你先阅读《SQLMesh系列教程-1&#xff1a;数据工程师的高效利器-SQLMesh》。 在本文中&#xff0c;我们将完成一个小项目或教程&#xff0c;以帮助你开始使用SQLMesh。你可以选择一步一步…...

把 DeepSeek1.5b 部署在显卡小于4G的电脑上

这里写自定义目录标题 介绍准备安装 Ollama查看CUDA需要版本安装CudaToolkit检查Cuda是否装好设置Ollama环境变量验证是否跑在GPU上ollama如何导入本地下载的模型安装及配置docker安装open-webui启动open-webui开始对话 调整gpu精度 介绍 Deepseek1.5b能够运行在只用cpu和gpu内…...

#渗透测试#批量漏洞挖掘#29网课交单平台 SQL注入

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 目录 1. 漏洞原理 2. 漏洞定位 3. 攻击验证示…...

试试DeepSeek写prompt+stable diffusion生成漫画

#deepseek #stable diffusion 模型&#xff1a;dreamshaperXL_v21TurboDPMSDE.safetensors 一、情节拟定 漫画情节由deepseek自编自导&#xff0c;画幅为四张。 Prompt 1: 魔法觉醒 "一个平凡的少年在阁楼发现一本古老的魔法书&#xff0c;书页散发着微弱的蓝光。画…...

java面试题之 int和Integer的区别

int和Integer的区别 1、Integer是int的包装类&#xff0c;int则是java的一种基本数据类型 2、Integer变量必须实例化后才能使用&#xff0c;而int变量不需要 3、Integer实际是对象的引用&#xff0c;当new一个Integer时&#xff0c;实际上是生成一个指针指向此对象&#xff1b…...

Spring Bean的生命周期

1、对象实例化 2、属性设置 3、初始化 4、使用 5、销毁 示例代码如下&#xff1a; import org.springframework.stereotype.Component;Component public class SpringBeanA {public SpringBeanA() {System.out.println("第一步&#xff1a;实例化(spring对象&#x…...

Vue 发送 PDF 文件链接到 WinForm 程序进行打印

Vue 发送 PDF 文件链接到 WinForm 程序进行打印的完整流程如下&#xff1a; 1. Vue 端 Vue 通过 fetch 或 axios 发送 PDF 文件的 URL 给 WinForms 程序&#xff08;WinForms 需要开启一个本地 API&#xff09;。 <template><div><button click"sendPri…...

Vue笔记(十)

一、AI的基本认知 二、ChatGPT的基本使用 三、AI插件--Copilot入门 1.Copilot是由OpenAI和GitHub合作开发的AI编程辅助插件&#xff0c;基于大量代码训练&#xff0c;能根据上下文自动生成代码建议。 2.安装与配置&#xff1a;在常用代码编辑器&#xff08;如Visual Studio Cod…...

使用LangChainV3.0加载PDF文件并进行总结

LangChain目前已经更新到了V3版本&#xff0c;之前一直使用的V1版本&#xff0c;有很多方法都需要自己去封装&#xff0c;这次重新看了V3版本的API文档&#xff0c;很多方法都十分便利&#xff0c;调用方法简单明了十分方便&#xff0c;下面就来展示下这次对于PDF文件加载的优化…...

玩转大语言模型——使用Kiln AI可视化环境进行大语言模型微调数据合成

系列文章目录 玩转大语言模型——使用langchain和Ollama本地部署大语言模型 玩转大语言模型——三分钟教你用langchain提示词工程获得猫娘女友 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 玩转大语言模型—…...

EasyRTC智能硬件:小体积,大能量,开启音视频互动新体验

在万物互联的时代&#xff0c;智能硬件正以前所未有的速度融入我们的生活。然而&#xff0c;受限于硬件性能和网络环境&#xff0c;许多智能硬件在音视频互动体验上仍存在延迟高、卡顿、回声等问题&#xff0c;严重影响了用户的使用体验。 EasyRTC智能硬件&#xff0c;凭借其强…...

vue知识点5

1.如何让组件里的样式与其他组件互相不干扰 scope范围的意思 <style scope> </style> 2.vue的生命周期 创建 挂载 更新 销毁 3.vue的四个生命周期详解 创建beforeCreate,created 挂载 beforeMount,mounted 更新 beforeUpdate,updated 销毁 beforeDest…...

qt的QSizePolicy的使用

使用 QSizePolicy 设置控件的伸缩因子 在 Qt 中&#xff0c;QSizePolicy 控制 控件如何在布局中伸缩。如果想要影响控件的大小调整行为&#xff0c;可以通过 QSizePolicy::setHorizontalStretch() 和 QSizePolicy::setVerticalStretch() 设置伸缩因子。 基本用法 假设我们有一个…...

基于 FFmpeg 和 OpenGLES 的 iOS 视频预览和录制技术方案设计

基于 FFmpeg 和 OpenGLES 的 iOS 视频预览和录制技术方案设计 在 iOS 上实现一个基于 FFmpeg 和 OpenGLES 的视频预览和录制功能,需要结合 FFmpeg 的强大音视频处理能力和 OpenGLES 的高效图形渲染能力。以下是一个完整的技术方案设计,包含项目的架构设计、模块划分、技术选…...

如何保障 MySQL 和 Redis 的数据一致性

在现代分布式系统中&#xff0c;确保不同数据存储&#xff08;如 MySQL 和 Redis&#xff09;之间的一致性是一个常见的挑战。MySQL 是一种关系型数据库管理系统&#xff0c;而 Redis 是一种内存中的键值存储系统&#xff0c;通常用于缓存和快速访问数据。本文将详细介绍几种保…...

【LeetCode Hot100 子串】和为 k 的子数组、滑动窗口最大值、最小覆盖子串

子串 1. 和为 k 的子数组题目描述解题思路主要思路步骤 时间复杂度与空间复杂度代码实现 2. 滑动窗口最大值题目描述解题思路双端队列的原理&#xff1a;优化步骤&#xff1a; Java实现 3. 最小覆盖子串题目描述解题思路滑动窗口的基本思路&#xff1a;具体步骤&#xff1a;算法…...

【CLIP系列】4:目标检测(ViLD、GLIP)

目录 1 ViLD2 GLIP2.1 前言2.2 损失计算2.3 模型框架 1 ViLD OPEN-VOCABULARY OBJECT DETECTION VIA VISION AND LANGUAGE KNOWLEDGE DISTILLATION 从标题就能看出来&#xff0c;作者是把CLIP模型当成一个Teacher&#xff0c;去蒸馏他自己的网络&#xff0c;从而能Zero Shot去…...

vue-谷歌浏览器安装vue-devtools插件

文章目录 一、谷歌浏览器安装vue-devtools1.1、方式一&#xff1a;直接下载crx并安装 本文讲解谷歌浏览器安装vue-devtools插件的步骤。 注意&#xff1a;以下vue-devtools插件都是vue2版本的。 一、谷歌浏览器安装vue-devtools 1.1、方式一&#xff1a;直接下载crx并安装 …...