樂觀鎖與悲觀鎖的使用場景

悲觀鎖的應用場景
悲觀鎖的基本思想是假設并發沖突會發生,因此在操作數據時會先鎖定數據,直到完成操作并提交事務后才釋放鎖。這種方式適用于寫操作較多、并發沖突可能性較高的場景。

高寫入比例的數據庫操作:如果系統中有很多寫操作,并且這些寫操作可能會頻繁地相互干擾,那么使用悲觀鎖可以有效避免數據不一致的問題。
對數據一致性要求高的場景:比如金融交易系統,銀行轉賬,高并發點贊等,需要確保在任何時刻的數據都是一致的,不允許出現臟讀、不可重復讀等問題。
樂觀鎖的應用場景
樂觀鎖則假定并發沖突不會經常發生,因此它不會在開始操作時就鎖定資源,而是在提交更新時檢查是否有其他事務已經修改了該數據。如果檢測到沖突,則拒絕此次操作。樂觀鎖更適用于讀多寫少的環境。

讀操作遠多于寫操作的場景:例如在線閱讀平臺、新聞網站等,這類應用主要以讀取信息為主,很少會有數據修改的需求,采用樂觀鎖可以減少鎖帶來的性能損耗。
低沖突概率的環境:當系統預期不同事務之間很少會對同一數據進行修改時,使用樂觀鎖可以獲得更好的性能表現。比如庫存管理系統中,對于非熱銷商品的庫存調整。
選擇哪種鎖機制應基于具體的應用場景以及系統對性能和一致性的需求來決定。在實際開發過程中,還需要考慮死鎖預防、鎖的粒度等因素。

點贊悲觀鎖實現

以下是基于 Java 和 MyBatis-Plus 實現悲觀鎖的點贊功能的完整代碼示例。

1. 數據庫表設計

假設我們有一個 articles 表,包含以下字段:

id: 文章唯一標識。
title: 文章標題。
content: 文章內容。
likes: 點贊數。
sql
深色版本
CREATE TABLE articles (
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(255) NOT NULL,
content TEXT NOT NULL,
likes INT DEFAULT 0
);

2. 配置 MyBatis-Plus 和數據庫連接

2.1 添加依賴
在 pom.xml 文件中添加 MyBatis-Plus 和 MySQL 驅動依賴(與之前一致)。

2.2 配置數據庫連接
在 application.yml 中配置數據庫連接信息(與之前一致)。

3. 實體類和 Mapper 接口

3.1 創建實體類
java
深色版本

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;@Data
@TableName("articles")
public class Article {@TableIdprivate Long id;private String title;private String content;private Integer likes;
}

3.2 創建 Mapper 接口
java
深色版本

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;@Mapper
public interface ArticleMapper extends BaseMapper<Article> {/*** 悲觀鎖查詢文章*/@Select("SELECT * FROM articles WHERE id = #{id} FOR UPDATE")Article selectForUpdate(Long id);/*** 更新點贊數*/@Update("UPDATE articles SET likes = likes + 1 WHERE id = #{id}")int incrementLikes(Long id);
}

4. 實現點贊功能

4.1 Service 層實現
悲觀鎖的核心在于使用 FOR UPDATE 鎖定數據行,確保在事務提交前其他事務無法修改該行數據。

java
深色版本

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;@Service
public class ArticleService {@Autowiredprivate ArticleMapper articleMapper;/*** 使用悲觀鎖實現點贊*/@Transactional // 開啟事務public String likeArticle(Long articleId) {// 使用悲觀鎖查詢文章(鎖定該行)Article article = articleMapper.selectForUpdate(articleId);if (article == null) {return "Article not found";}// 更新點贊數int rows = articleMapper.incrementLikes(articleId);if (rows > 0) {return "Like successful, new likes: " + (article.getLikes() + 1);} else {return "Failed to update likes";}}
}

4.2 Controller 層實現
java
深色版本

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/articles")
public class ArticleController {@Autowiredprivate ArticleService articleService;/*** 點贊接口*/@PostMapping("/{id}/like")public String likeArticle(@PathVariable Long id) {return articleService.likeArticle(id);}
}

5. 測試接口

啟動 Spring Boot 應用后,可以通過以下方式測試點贊功能:

請求示例
bash
深色版本
POST http://localhost:8080/articles/1/like
響應結果
成功時返回:“Like successful, new likes: X”
如果文章不存在,返回:“Article not found”

6. 核心原理

悲觀鎖的工作流程:
在查詢文章時,使用 FOR UPDATE 鎖定目標數據行。
在事務提交之前,其他事務無法對該行數據進行修改。
更新點贊數后提交事務,釋放鎖。
SQL 示例:
sql
深色版本
– 查詢并鎖定數據行
SELECT * FROM articles WHERE id = 1 FOR UPDATE;

– 更新點贊數
UPDATE articles SET likes = likes + 1 WHERE id = 1;
適用場景:
適用于寫操作較多且并發沖突概率較高的場景。
例如,在高并發環境下對同一篇文章進行頻繁點贊時,可以避免數據不一致的問題。

7. 注意事項

性能開銷:
悲觀鎖會鎖定數據行,可能導致其他事務阻塞,影響系統性能。
因此,只有在確實需要嚴格保證數據一致性時才使用悲觀鎖。
死鎖風險:
如果多個事務同時嘗試鎖定不同的資源,可能會導致死鎖。
需要合理設計事務邏輯,盡量減少死鎖的可能性。
事務管理:
必須確保在事務中執行鎖定和更新操作,否則鎖定不起作用。
通過以上代碼,我們可以利用悲觀鎖實現點贊功能,確保在高并發場景下的數據一致性。

點贊樂觀鎖實現

以下是使用 Java 和 MyBatis-Plus 實現樂觀鎖的代碼示例。我們將基于 Spring Boot 和 MyBatis-Plus 框架完成點贊功能。

1. 數據庫表設計

假設我們有一個 articles 表,包含以下字段:

id: 文章唯一標識。
title: 文章標題。
content: 文章內容。
likes: 點贊數。
version: 版本號(用于樂觀鎖)。
sql
深色版本
CREATE TABLE articles (
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(255) NOT NULL,
content TEXT NOT NULL,
likes INT DEFAULT 0,
version INT DEFAULT 0
);

2. 配置 MyBatis-Plus 和數據庫連接

2.1 添加依賴
在 pom.xml 文件中添加 MyBatis-Plus 和 MySQL 驅動依賴:

xml
深色版本



org.springframework.boot
spring-boot-starter-web

<!-- MyBatis-Plus -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version>
</dependency><!-- MySQL Driver -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope>
</dependency><!-- Lombok (Optional for code simplification) -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
</dependency>
2.2 配置數據庫連接 在 application.yml 中配置數據庫連接信息:

yaml
深色版本
spring:
datasource:
url: jdbc:mysql://localhost:3306/your_database?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
username: your_username
password: your_password
driver-class-name: com.mysql.cj.jdbc.Driver

mybatis-plus:
mapper-locations: classpath:/mapper/*.xml
configuration:
map-underscore-to-camel-case: true

3. 實體類和 Mapper 接口

3.1 創建實體類
使用 @Version 注解來標識版本號字段。

java
深色版本

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.Version;
import lombok.Data;@Data
@TableName("articles")
public class Article {@TableIdprivate Long id;private String title;private String content;private Integer likes;@Versionprivate Integer version; // 版本號字段,用于樂觀鎖
}

3.2 創建 Mapper 接口
繼承 MyBatis-Plus 提供的 BaseMapper 接口。

java
深色版本

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface ArticleMapper extends BaseMapper<Article> {
}

4. 配置樂觀鎖插件

在 Spring Boot 啟動類中配置 MyBatis-Plus 的樂觀鎖插件。

java
深色版本

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MyBatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 添加樂觀鎖插件interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());return interceptor;}
}

5. 實現點贊功能

5.1 Service 層實現
編寫點贊邏輯,使用樂觀鎖更新點贊數。

java
深色版本

import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class ArticleService {@Autowiredprivate ArticleMapper articleMapper;public String likeArticle(Long articleId) {// 查詢文章信息Article article = articleMapper.selectById(articleId);if (article == null) {return "Article not found";}// 更新點贊數和版本號article.setLikes(article.getLikes() + 1);// 使用 MyBatis-Plus 自動處理樂觀鎖int rows = articleMapper.updateById(article);if (rows > 0) {return "Like successful, new likes: " + article.getLikes();} else {return "Optimistic lock conflict, please try again";}}
}

5.2 Controller 層實現
提供 RESTful API 接口。

java
深色版本

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/articles")
public class ArticleController {@Autowiredprivate ArticleService articleService;@PostMapping("/{id}/like")public String likeArticle(@PathVariable Long id) {return articleService.likeArticle(id);}
}

6. 測試接口

啟動 Spring Boot 應用后,可以通過以下方式測試點贊功能:

請求示例
bash
深色版本
POST http://localhost:8080/articles/1/like
響應結果
成功時返回:“Like successful, new likes: X”
如果發生樂觀鎖沖突,返回:“Optimistic lock conflict, please try again”

7. 核心原理

樂觀鎖的核心思想:
在更新數據時,MyBatis-Plus 會自動檢查 version 字段是否匹配。
如果匹配,則更新數據并遞增 version。
如果不匹配,則更新失敗,返回受影響行數為 0。
SQL 示例:
sql
深色版本
UPDATE articles
SET likes = likes + 1, version = version + 1
WHERE id = 1 AND version = current_version;
適用場景:
適用于讀多寫少且沖突概率較低的場景,如點贊、評論、瀏覽量統計等。
通過以上代碼,我們可以輕松實現基于 MyBatis-Plus 的樂觀鎖功能,確保在高并發場景下的數據一致性。

銀行轉賬悲觀鎖實現

在銀行轉賬的場景中,悲觀鎖是一種非常合適的并發控制機制。由于銀行轉賬涉及資金的流動,數據一致性至關重要,因此使用悲觀鎖可以確保在事務完成之前,相關賬戶不會被其他事務修改。

以下是基于 Java 和 MyBatis-Plus 實現銀行轉賬功能的完整代碼示例,其中使用了悲觀鎖來保證事務的安全性。

1. 數據庫表設計

假設我們有一個 accounts 表,用于存儲用戶賬戶信息:

id: 賬戶唯一標識。
user_name: 用戶名。
balance: 賬戶余額。
sql
深色版本
CREATE TABLE accounts (
id INT PRIMARY KEY AUTO_INCREMENT,
user_name VARCHAR(255) NOT NULL,
balance DECIMAL(10, 2) NOT NULL DEFAULT 0.00
);

2. 配置 MyBatis-Plus 和數據庫連接

2.1 添加依賴
在 pom.xml 文件中添加 MyBatis-Plus 和 MySQL 驅動依賴(與之前一致)。

2.2 配置數據庫連接
在 application.yml 中配置數據庫連接信息:

yaml
深色版本
spring:
datasource:
url: jdbc:mysql://localhost:3306/your_database?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
username: your_username
password: your_password
driver-class-name: com.mysql.cj.jdbc.Driver

mybatis-plus:
mapper-locations: classpath:/mapper/*.xml
configuration:
map-underscore-to-camel-case: true

3. 實體類和 Mapper 接口

3.1 創建實體類
java
深色版本

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;import java.math.BigDecimal;@Data
@TableName("accounts")
public class Account {@TableIdprivate Long id;private String userName;private BigDecimal balance;
}

3.2 創建 Mapper 接口
java
深色版本

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;@Mapper
public interface AccountMapper extends BaseMapper<Account> {/*** 悲觀鎖查詢賬戶*/@Select("SELECT * FROM accounts WHERE id = #{id} FOR UPDATE")Account selectForUpdate(Long id);/*** 更新賬戶余額*/@Update("UPDATE accounts SET balance = balance + #{amount} WHERE id = #{id}")int updateBalance(Long id, BigDecimal amount);
}

4. 實現轉賬功能

4.1 Service 層實現
悲觀鎖的核心在于使用 FOR UPDATE 鎖定賬戶行,確保在事務提交前其他事務無法修改賬戶余額。

java
深色版本

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import java.math.BigDecimal;@Service
public class AccountService {@Autowiredprivate AccountMapper accountMapper;/*** 使用悲觀鎖實現轉賬** @param fromAccountId 轉出賬戶 ID* @param toAccountId   轉入賬戶 ID* @param amount        轉賬金額*/@Transactional // 開啟事務public String transfer(Long fromAccountId, Long toAccountId, BigDecimal amount) {if (amount.compareTo(BigDecimal.ZERO) <= 0) {return "Invalid transfer amount";}// 查詢轉出賬戶并加鎖Account fromAccount = accountMapper.selectForUpdate(fromAccountId);if (fromAccount == null || fromAccount.getBalance().compareTo(amount) < 0) {return "Insufficient balance or invalid account";}// 查詢轉入賬戶并加鎖Account toAccount = accountMapper.selectForUpdate(toAccountId);if (toAccount == null) {return "Invalid target account";}// 執行轉賬操作accountMapper.updateBalance(fromAccountId, amount.negate()); // 減少轉出賬戶余額accountMapper.updateBalance(toAccountId, amount); // 增加轉入賬戶余額return "Transfer successful";}
}

4.2 Controller 層實現
java
深色版本

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.math.BigDecimal;@RestController
@RequestMapping("/accounts")
public class AccountController {@Autowiredprivate AccountService accountService;/*** 轉賬接口*/@PostMapping("/transfer")public String transfer(@RequestParam Long fromAccountId,@RequestParam Long toAccountId,@RequestParam BigDecimal amount) {return accountService.transfer(fromAccountId, toAccountId, amount);}
}

5. 測試接口

啟動 Spring Boot 應用后,可以通過以下方式測試轉賬功能:

請求示例
bash
深色版本
POST http://localhost:8080/accounts/transfer?fromAccountId=1&toAccountId=2&amount=100.00
響應結果
成功時返回:“Transfer successful”
如果余額不足或賬戶無效,返回相應的錯誤信息。

6. 核心原理

悲觀鎖的工作流程:
在查詢賬戶時,使用 FOR UPDATE 鎖定目標賬戶的數據行。
在事務提交之前,其他事務無法對該賬戶進行修改。
完成轉賬操作后提交事務,釋放鎖。
SQL 示例:
sql
深色版本
– 查詢并鎖定賬戶
SELECT * FROM accounts WHERE id = 1 FOR UPDATE;

– 更新賬戶余額
UPDATE accounts SET balance = balance - 100.00 WHERE id = 1;
UPDATE accounts SET balance = balance + 100.00 WHERE id = 2;
適用場景:
適用于寫操作較多且并發沖突概率較高的場景。
例如,在高并發環境下進行銀行轉賬時,可以避免重復扣款或余額不一致的問題。

7. 注意事項

性能開銷:
悲觀鎖會鎖定數據行,可能導致其他事務阻塞,影響系統性能。
因此,只有在確實需要嚴格保證數據一致性時才使用悲觀鎖。
死鎖風險:
如果多個事務同時嘗試鎖定不同的資源,可能會導致死鎖。
需要合理設計事務邏輯,盡量減少死鎖的可能性(例如,按照固定的順序鎖定賬戶)。
事務管理:
必須確保在事務中執行鎖定和更新操作,否則鎖定不起作用。
通過以上代碼,我們可以利用悲觀鎖實現銀行轉賬功能,確保在高并發場景下的數據一致性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/77334.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/77334.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/77334.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

cpp(c++)win 10編譯GDAL、PROJ、SQLite3、curl、libtiff

cpp&#xff08;c&#xff09;編譯GDAL、PROJ、SQLite3 Sqlite3libtiffcurlprojGDAL Sqlite3 1、下載 Sqlite3 源碼、工具、二進制預編譯 exe Sqlite3 官網&#xff1a;https://www.sqlite.org/download.html 下載 sqlite-amalgamation-3430200.zipsqlite-dll-win64-x64-3430…

【愚公系列】《高效使用DeepSeek》062-圖書庫存管理

??【技術大咖愚公搬代碼:全棧專家的成長之路,你關注的寶藏博主在這里!】?? ??開發者圈持續輸出高質量干貨的"愚公精神"踐行者——全網百萬開發者都在追更的頂級技術博主! ?? 江湖人稱"愚公搬代碼",用七年如一日的精神深耕技術領域,以"…

鏈表算法中常用操作和技巧

目 1.常用技巧 1.1.畫圖 1.2.添加虛擬頭節點 1.3.大膽引入中間變量 1.4.快慢雙指針 1.4.1判斷鏈表是否有環 1.4.2找鏈表中環的入口 ?2.常用操作 2.1. 創建一個新節點 2.2.尾插 2.3.頭插 1.常用技巧 1.1.畫圖 畫圖可以讓一些抽象的文字語言更加形象生動 畫圖&#…

【9】數據結構的串篇章

目錄標題 串的定義順序串的實現初始化賦值打印串求串的長度復制串判斷兩個串長度是否相等連接兩個串比較兩個串內容是否相等插入操作刪除操作調試與代碼合集 串的模式匹配算法樸素的模式匹配算法KMP算法實現模式匹配 串的定義 定義&#xff1a;由0個或多個字符組成的有限序列&…

GMSL Strapping Pins CFG0/CFG1 應用

GMSL device 使用起來還是比較簡單 ADI 已經充分考慮了用戶的需求&#xff0c;盡可能的降低的芯片的使用和配置復雜度 一對加串器和解串器&#xff0c;只要工作模式匹配得當&#xff0c;Link Locked&#xff0c;便能夠正常工作 如果遇到 Link 無法建立&#xff08;Locked&…

`uia.WindowControl` 是什么:獲取窗口文字是基于系統的 UI 自動化接口,而非 OCR 方式

uia.WindowControl 是什么:獲取窗口文字是基于系統的 UI 自動化接口,而非 OCR 方式 uia.WindowControl 通常是基于 Windows 系統的 UI 自動化框架(如 pywinauto 中的 uia 模塊)里用于表示窗口控件的類。在 Windows 操作系統中,每個應用程序的窗口都可以看作是一個控件,ui…

Easysearch VS Opensearch 數據寫入與存儲性能對比

本文記錄 Easysearch 和 Opensearch 數據寫入和數據存儲方面的性能對比。 準備 壓測工具&#xff1a;INFINI Loadgen 對比版本&#xff1a; Easysearch 1.11.1&#xff08;lucene 8.11.4&#xff09;Opensearch 2.19.1&#xff08;lucene 9.12.1&#xff09; 節點 JVM 配置…

力扣題解:142. 環形鏈表 II

在鏈表學習中&#xff0c;我們已經了解了單鏈表和雙鏈表&#xff0c;兩者的最后一個結點都會指向NULL&#xff1b;今天我們介紹的循環列表則不同&#xff0c;其末尾結點指向的這是鏈表中的一個結點。 循環鏈表是一種特殊類型的鏈表&#xff0c;其尾節點的指針指向頭節點&#…

區間 dp 系列 題解

1.洛谷 P4342 IOI1998 Polygon 我的博客 2.洛谷 P4290 HAOI2008 玩具取名 題意 某人有一套玩具&#xff0c;并想法給玩具命名。首先他選擇 W, I, N, G 四個字母中的任意一個字母作為玩具的基本名字。然后他會根據自己的喜好&#xff0c;將名字中任意一個字母用 W, I, N, G …

天基光學圖像仿真原理簡介

一、原理簡介 天基光學圖像仿真通過數學模型和算法模擬空間目標在光學系統中的成像過程&#xff0c;核心原理可歸納為以下四部分&#xff1a; 1. 目標與背景建模? 目標運動建模?&#xff1a;利用軌道動力學模型&#xff08;如SGP4&#xff09;解析空間目標軌跡&#xff0c;…

Jetpack Compose 狀態保存機制全面解析:讓UI狀態持久化

在Android開發中&#xff0c;Jetpack Compose 的狀態管理是一個核心話題&#xff0c;而狀態保存則是確保良好用戶體驗的關鍵。本文將深入探討Compose中各種狀態保存技術&#xff0c;幫助你在配置變更和進程重建時保持UI狀態。 一、基礎保存&#xff1a;rememberSaveable reme…

【Json-Rpc #1】項目背景及環境搭建

&#x1f4c3;個人主頁&#xff1a;island1314 &#x1f525;個人博客&#xff1a;island ?? 歡迎關注&#xff1a;&#x1f44d;點贊 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f49e; &#x1f49e; &#x1f49e; 生活總是不會一帆風順&#xff0c;前進…

WPF輪播圖動畫交互 動畫縮放展示圖片

WPF輪播圖動畫交互 動畫縮放展示圖片 效果如下圖&#xff1a; XAML代碼&#xff1a; <Window x:Class"Caroursel.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/20…

為什么 npm list -g 沒顯示 node_modules??

揭秘&#xff1a;為什么 npm list -g 沒顯示 node_modules&#xff1f;&#x1f575;??♂?? 嗨&#xff0c;各位代碼探險家&#xff01;&#x1f44b; 今天我們要破解一個 npm 小謎團&#xff1a;運行 npm list -g --depth0 時&#xff0c;為什么輸出的路徑里看不到 node_…

都江堰與鄭國渠

目錄標題 一、歷史背景&#xff1a;地緣博弈下的水利突圍都江堰&#xff1a;化水患為天府的千年大計鄭國渠&#xff1a;間諜引發的戰略反轉 二、工程智慧&#xff1a;超越時代的科技奇跡都江堰&#xff1a;生態治水的典范鄭國渠&#xff1a;泥沙資源化的創舉 三、后世影響&…

鏈路聚合+vrrp

1.鏈路聚合 作用注意事項將多個物理接口&#xff08;線路&#xff09;邏輯上綁定在一起形成一條邏輯鏈路&#xff0c;起到疊加帶寬的作用1.聚合接口必須轉發速率一致。2.聚合設備兩端必須一致 配置命令 方法一 [Huawei]interface Eth-Trunk 0----先創建聚合接口&#xff0c;…

【STM32單片機】#7 定時器輸入捕獲

主要參考學習資料&#xff1a; B站江協科技 STM32入門教程-2023版 細致講解 中文字幕 開發資料下載鏈接&#xff1a;https://pan.baidu.com/s/1h_UjuQKDX9IpP-U1Effbsw?pwddspb 單片機套裝&#xff1a;STM32F103C8T6開發板單片機C6T6核心板 實驗板最小系統板套件科協 實驗&…

【android bluetooth 框架分析 01】【關鍵線程 3】【bt_jni_thread 線程介紹】

1. bt_jni_thread 職責介紹 bt_jni_thread 這個線程的作用是專門負責處理藍牙 JNI 層的消息循環&#xff0c;也可以說是 C 層和 Java 層交互的橋梁線程。 1.1 什么是 JNI 層&#xff1f;為什么需要這個線程&#xff1f; JNI&#xff08;Java Native Interface&#xff09;是 …

基于視覺語言模型的機器人實時探索系統!ClipRover:移動機器人零樣本視覺語言探索和目標發現

作者&#xff1a;Yuxuan Zhang 1 ^{1} 1, Adnan Abdullah 2 ^{2} 2, Sanjeev J. Koppal 3 ^{3} 3, and Md Jahidul Islam 4 ^{4} 4單位&#xff1a; 2 , 4 ^{2,4} 2,4佛羅里達大學電氣與計算機工程系RoboPI實驗室&#xff0c; 1 , 3 ^{1,3} 1,3佛羅里達大學電氣與計算機工程系F…

SpringBoot和微服務學習記錄Day2

微服務 微服務將單體應用分割成更小的的獨立服務&#xff0c;部署在不同的服務器上。服務間的關聯通過暴露的api接口來實現 優點&#xff1a;高內聚低耦合&#xff0c;一個模塊有問題不影響整個應用&#xff0c;增加可靠性&#xff0c;更新技術方便 缺點&#xff1a;增加運維…