女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

什么是循環(huán)依賴?

倩倩 ? 來源:樓仔 ? 作者:樓仔 ? 2022-09-08 10:49 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群


7d76c324-2f1f-11ed-ba43-dac502259ad0.png

1. 基礎(chǔ)知識(shí)

1.1 什么是循環(huán)依賴 ?

一個(gè)或多個(gè)對象之間存在直接或間接的依賴關(guān)系,這種依賴關(guān)系構(gòu)成一個(gè)環(huán)形調(diào)用,有下面 3 種方式。

7d9ea39e-2f1f-11ed-ba43-dac502259ad0.png

我們看一個(gè)簡單的 Demo,對標(biāo)“情況 2”。

@Service
publicclassLouzai1{

@Autowired
privateLouzai2louzai2;

publicvoidtest1(){
}
}

@Service
publicclassLouzai2{
@Autowired
privateLouzai1louzai1;

publicvoidtest2(){
}
}

這是一個(gè)經(jīng)典的循環(huán)依賴,它能正常運(yùn)行,后面我們會(huì)通過源碼的角度,解讀整體的執(zhí)行流程。

1.2 三級(jí)緩存

解讀源碼流程之前,spring 內(nèi)部的三級(jí)緩存邏輯必須了解,要不然后面看代碼會(huì)蒙圈。

  • 第一級(jí)緩存 :singletonObjects,用于保存實(shí)例化、注入、初始化完成的 bean 實(shí)例;
  • 第二級(jí)緩存 :earlySingletonObjects,用于保存實(shí)例化完成的 bean 實(shí)例;
  • 第三級(jí)緩存 :singletonFactories,用于保存 bean 創(chuàng)建工廠,以便后面有機(jī)會(huì)創(chuàng)建代理對象。

這是最核心,我們直接上源碼:

7db71186-2f1f-11ed-ba43-dac502259ad0.png

執(zhí)行邏輯:

  • 先從“第一級(jí)緩存”找對象,有就返回,沒有就找“二級(jí)緩存”;
  • 找“二級(jí)緩存”,有就返回,沒有就找“三級(jí)緩存”;
  • 找“三級(jí)緩存”,找到了,就獲取對象,放到“二級(jí)緩存”,從“三級(jí)緩存”移除。

1.3 原理執(zhí)行流程

我把“情況 2”執(zhí)行的流程分解為下面 3 步,是不是和“套娃”很像 ?

7de0ad48-2f1f-11ed-ba43-dac502259ad0.png

整個(gè)執(zhí)行邏輯如下:

  1. 在第一層中,先去獲取 A 的 Bean,發(fā)現(xiàn)沒有就準(zhǔn)備去創(chuàng)建一個(gè),然后將 A 的代理工廠放入“三級(jí)緩存”(這個(gè) A 其實(shí)是一個(gè)半成品,還沒有對里面的屬性進(jìn)行注入 ),但是 A 依賴 B 的創(chuàng)建,就必須先去創(chuàng)建 B;
  2. 在第二層中,準(zhǔn)備創(chuàng)建 B,發(fā)現(xiàn) B 又依賴 A,需要先去創(chuàng)建 A;
  3. 在第三層中,去創(chuàng)建 A,因?yàn)榈谝粚右呀?jīng)創(chuàng)建了 A 的代理工廠,直接從“三級(jí)緩存”中拿到 A 的代理工廠,獲取 A 的代理對象,放入“二級(jí)緩存” ,并清除“三級(jí)緩存”;
  4. 回到第二層,現(xiàn)在有了 A 的代理對象,對 A 的依賴完美解決(這里的 A 仍然是個(gè)半成品 ),B 初始化成功;
  5. 回到第一層,現(xiàn)在 B 初始化成功,完成 A 對象的屬性注入,然后再填充 A 的其它屬性,以及 A 的其它步驟(包括 AOP),完成對 A 完整的初始化功能(這里的 A 才是完整的 Bean )。
  6. 將 A 放入“一級(jí)緩存”。

為什么要用 3 級(jí)緩存 ?我們先看源碼執(zhí)行流程,后面我會(huì)給出答案。

基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro
  • 視頻教程:https://doc.iocoder.cn/video/

2. 源碼解讀

注意:Spring 的版本是 5.2.15.RELEASE ,否則和我的代碼不一樣!!!

上面的知識(shí),網(wǎng)上其實(shí)都有,下面才是我們的重頭戲,讓你跟著樓仔,走一遍代碼流程。

2.1 代碼入口

7e0d204e-2f1f-11ed-ba43-dac502259ad0.png7e326a16-2f1f-11ed-ba43-dac502259ad0.png

這里需要多跑幾次,把前面的 beanName 跳過去,只看 louzai1。

7e50616a-2f1f-11ed-ba43-dac502259ad0.png7e72d556-2f1f-11ed-ba43-dac502259ad0.png

2.2 第一層

7e905a36-2f1f-11ed-ba43-dac502259ad0.png

進(jìn)入 doGetBean(),從 getSingleton() 沒有找到對象,進(jìn)入創(chuàng)建 Bean 的邏輯。

7eb0d770-2f1f-11ed-ba43-dac502259ad0.png7ecdbbb0-2f1f-11ed-ba43-dac502259ad0.png

進(jìn)入 doCreateBean() 后,調(diào)用 addSingletonFactory()。

7ef65eb2-2f1f-11ed-ba43-dac502259ad0.png

往三級(jí)緩存 singletonFactories 塞入 louzai1 的工廠對象。

7f17fe3c-2f1f-11ed-ba43-dac502259ad0.png7f52c4a4-2f1f-11ed-ba43-dac502259ad0.png

進(jìn)入到 populateBean(),執(zhí)行 postProcessProperties(),這里是一個(gè)策略模式,找到下圖的策略對象。

7f71d3a8-2f1f-11ed-ba43-dac502259ad0.png

正式進(jìn)入該策略對應(yīng)的方法。

7f9b11b4-2f1f-11ed-ba43-dac502259ad0.png

下面都是為了獲取 louzai1 的成員對象,然后進(jìn)行注入。

7fa65650-2f1f-11ed-ba43-dac502259ad0.png7fd14914-2f1f-11ed-ba43-dac502259ad0.png7fed7fd0-2f1f-11ed-ba43-dac502259ad0.png7ff82c0a-2f1f-11ed-ba43-dac502259ad0.png

進(jìn)入 doResolveDependency(),找到 louzai1 依賴的對象名 louzai2

8008ff76-2f1f-11ed-ba43-dac502259ad0.png

需要獲取 louzai2 的 bean,是 AbstractBeanFactory 的方法。

8018f020-2f1f-11ed-ba43-dac502259ad0.png

正式獲取 louzai2 的 bean。

8034f6b2-2f1f-11ed-ba43-dac502259ad0.png

到這里,第一層套娃基本結(jié)束,因?yàn)?louzai1 依賴 louzai2,下面我們進(jìn)入第二層套娃。

2.3 第二層

804c28dc-2f1f-11ed-ba43-dac502259ad0.png

獲取 louzai2 的 bean,從 doGetBean(),到 doResolveDependency(),和第一層的邏輯完全一樣,找到 louzai2 依賴的對象名 louzai1。

前面的流程全部省略,直接到 doResolveDependency()。

806a87fa-2f1f-11ed-ba43-dac502259ad0.png

正式獲取 louzai1 的 bean。

80776cea-2f1f-11ed-ba43-dac502259ad0.png

到這里,第二層套娃結(jié)束,因?yàn)?louzai2 依賴 louzai1,所以我們進(jìn)入第三層套娃。

2.4 第三層

809c6b8a-2f1f-11ed-ba43-dac502259ad0.png

獲取 louzai1 的 bean,在第一層和第二層中,我們每次都會(huì)從 getSingleton() 獲取對象,但是由于之前沒有初始化 louzai1 和 louzai2 的三級(jí)緩存,所以獲取對象為空。

80c2d7c0-2f1f-11ed-ba43-dac502259ad0.png80e2b93c-2f1f-11ed-ba43-dac502259ad0.png

敲重點(diǎn)!敲重點(diǎn)!!敲重點(diǎn)!!!

到了第三層,由于第三級(jí)緩存有 louzai1 數(shù)據(jù),這里使用三級(jí)緩存中的工廠,為 louzai1 創(chuàng)建一個(gè)代理對象,塞入二級(jí)緩存。

80fca392-2f1f-11ed-ba43-dac502259ad0.png

這里就拿到了 louzai1 的代理對象,解決了 louzai2 的依賴關(guān)系,返回到第二層。

2.5 返回第二層

返回第二層后,louzai2 初始化結(jié)束,這里就結(jié)束了么?二級(jí)緩存的數(shù)據(jù),啥時(shí)候會(huì)給到一級(jí)呢?

甭著急,看這里,還記得在 doGetBean() 中,我們會(huì)通過 createBean() 創(chuàng)建一個(gè) louzai2 的 bean,當(dāng) louzai2 的 bean 創(chuàng)建成功后,我們會(huì)執(zhí)行 getSingleton(),它會(huì)對 louzai2 的結(jié)果進(jìn)行處理。

812f996e-2f1f-11ed-ba43-dac502259ad0.png

我們進(jìn)入 getSingleton(),會(huì)看到下面這個(gè)方法。

813aad22-2f1f-11ed-ba43-dac502259ad0.png

這里就是處理 louzai2 的 一、二級(jí)緩存的邏輯,將二級(jí)緩存清除,放入一級(jí)緩存。

815da99e-2f1f-11ed-ba43-dac502259ad0.png

2.6 返回第一層

同 2.5,louzai1 初始化完畢后,會(huì)把 louzai1 的二級(jí)緩存清除,將對象放入一級(jí)緩存。

818a0aac-2f1f-11ed-ba43-dac502259ad0.png

到這里,所有的流程結(jié)束,我們返回 louzai1 對象。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://gitee.com/zhijiantianya/yudao-cloud
  • 視頻教程:https://doc.iocoder.cn/video/

3. 原理深度解讀

3.1 什么要有 3 級(jí)緩存 ?

這是一道非常經(jīng)典的面試題,前面已經(jīng)告訴大家詳細(xì)的執(zhí)行流程,包括源碼解讀,但是沒有告訴大家為什么要用 3 級(jí)緩存?

這里是重點(diǎn)!敲黑板!!!

我們先說“一級(jí)緩存”的作用,變量命名為 singletonObjects,結(jié)構(gòu)是 Map,它就是一個(gè)單例池,將初始化好的對象放到里面,給其它線程使用,如果沒有第一級(jí)緩存,程序不能保證 Spring 的單例屬性。

“二級(jí)緩存”先放放,我們直接看“三級(jí)緩存”的作用,變量命名為 singletonFactories,結(jié)構(gòu)是 Map>,Map 的 Value 是一個(gè)對象的代理工廠,所以“三級(jí)緩存”的作用,其實(shí)就是用來存放對象的代理工廠。

那這個(gè)對象的代理工廠有什么作用呢,我先給出答案,它的主要作用是存放半成品的單例 Bean,目的是為了“打破循環(huán)” ,可能大家還是不太懂,這里我再稍微解釋一下。

我們回到文章開頭的例子,創(chuàng)建 A 對象時(shí),會(huì)把實(shí)例化的 A 對象存入“三級(jí)緩存”,這個(gè) A 其實(shí)是個(gè)半成品,因?yàn)闆]有完成 A 的依賴屬性 B 的注入,所以后面當(dāng)初始化 B 時(shí),B 又要去找 A,這時(shí)就需要從“三級(jí)緩存”中拿到這個(gè)半成品的 A(這里描述,其實(shí)也不完全準(zhǔn)確,因?yàn)椴皇侵苯幽茫瑸榱俗尨蠹液美斫猓揖拖冗@樣描述),打破循環(huán)。

那我再問一個(gè)問題,為什么“三級(jí)緩存”不直接存半成品的 A,而是要存一個(gè)代理工廠呢 ?答案是因?yàn)?AOP。

在解釋這個(gè)問題前,我們看一下這個(gè)代理工廠的源碼,讓大家有一個(gè)更清晰的認(rèn)識(shí)。

直接找到創(chuàng)建 A 對象時(shí),把實(shí)例化的 A 對象存入“三級(jí)緩存”的代碼,直接用前面的兩幅截圖。

7ef65eb2-2f1f-11ed-ba43-dac502259ad0.png7f17fe3c-2f1f-11ed-ba43-dac502259ad0.png

下面我們主要看這個(gè)對象工廠是如何得到的,進(jìn)入 getEarlyBeanReference() 方法。

81e4a674-2f1f-11ed-ba43-dac502259ad0.png8200c28c-2f1f-11ed-ba43-dac502259ad0.png8212d3fa-2f1f-11ed-ba43-dac502259ad0.png822e74d4-2f1f-11ed-ba43-dac502259ad0.png

最后一幅圖太重要了,我們知道這個(gè)對象工廠的作用:

  • 如果 A 有 AOP,就創(chuàng)建一個(gè)代理對象;
  • 如果 A 沒有 AOP,就返回原對象。

那“二級(jí)緩存”的作用就清楚了,就是用來存放對象工廠生成的對象,這個(gè)對象可能是原對象,也可能是個(gè)代理對象。

我再問一個(gè)問題,為什么要這樣設(shè)計(jì)呢?把二級(jí)緩存干掉不行么 ?我們繼續(xù)往下看。

3.2 能干掉第 2 級(jí)緩存么 ?

@Service
publicclassA{

@Autowired
privateBb;

@Autowired
privateCc;

publicvoidtest1(){
}
}

@Service
publicclassB{
@Autowired
privateAa;

publicvoidtest2(){
}
}

@Service
publicclassC{

@Autowired
privateAa;

publicvoidtest3(){
}
}

根據(jù)上面的套娃邏輯,A 需要找 B 和 C,但是 B 需要找 A,C 也需要找 A。

假如 A 需要進(jìn)行 AOP ,因?yàn)榇韺ο竺看味际巧刹煌膶ο螅绻傻舻诙?jí)緩存,只有第一、三級(jí)緩存:

  • B 找到 A 時(shí),直接通過三級(jí)緩存的工廠的代理對象,生成對象 A1。
  • C 找到 A 時(shí),直接通過三級(jí)緩存的工廠的代理對象,生成對象 A2。

看到問題沒?你通過 A 的工廠的代理對象,生成了兩個(gè)不同的對象 A1 和 A2 ,所以為了避免這種問題的出現(xiàn),我們搞個(gè)二級(jí)緩存,把 A1 存下來,下次再獲取時(shí),直接從二級(jí)緩存獲取,無需再生成新的代理對象。

所以“二級(jí)緩存”的目的是為了避免因?yàn)?AOP 創(chuàng)建多個(gè)對象,其中存儲(chǔ)的是半成品的 AOP 的單例 bean。

如果沒有 AOP 的話,我們其實(shí)只要 1、3 級(jí)緩存,就可以滿足要求。

4. 寫在最后

我們再回顧一下 3 級(jí)緩存的作用:

  • 一級(jí)緩存:為“Spring 的單例屬性”而生 ,就是個(gè)單例池,用來存放已經(jīng)初始化完成的單例 Bean;
  • 二級(jí)緩存:為“解決 AOP”而生 ,存放的是半成品的 AOP 的單例 Bean;
  • 三級(jí)緩存:為“打破循環(huán)”而生 ,存放的是生成半成品單例 Bean 的工廠方法。

如果你能理解上面我說的三條,恭喜你,你對 Spring 的循環(huán)依賴?yán)斫獾梅浅M笍兀?/p>

關(guān)于循環(huán)依賴的知識(shí),其實(shí)還有,因?yàn)槠颍揖筒辉賹懥耍?strong style="color:#0e88eb;">這篇文章的重點(diǎn),一方面是告訴大家循環(huán)依賴的核心原理,另一方面是讓大家自己去 debug 代碼 ,跑跑流程,挺有意思的。

可能有同學(xué)會(huì)問 “樓哥,你之前是不是經(jīng)常看源碼,然后這個(gè)流程,你是不是 debug 了很久?”

我之前其實(shí)沒怎么看過開源代碼,這個(gè)流程,前期理論知識(shí)看了 2.5 個(gè)小時(shí),然后 debug 4.5 小時(shí),就基本全部走通了,最難的地方,就是三層套娃,稍微有些繞。

這里也簡單說一下我看源碼的心得:

  1. 需要掌握基本的設(shè)計(jì)模式;
  2. 看源碼前,最好能找一些理論知識(shí)先看看;
  3. 學(xué)會(huì)讀英文注釋,不會(huì)的話就百度翻譯;
  4. debug 時(shí),要克制自己,不要陷入無用的細(xì)節(jié) ,這個(gè)最重要。

其中最難的是第 4 步,因?yàn)楹芏嗤瑢W(xué)看 Spring 源碼,每看一個(gè)方法,就想多研究研究,這樣很容易被繞進(jìn)去了,這個(gè)要學(xué)會(huì)克制,有大局觀,并能分辨哪里是核心邏輯 ,至于如何分辨,可以在網(wǎng)上先找些資料,如果沒有的話,就只能多看代碼了。

今天的源碼解析就到這了~


審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 源碼
    +關(guān)注

    關(guān)注

    8

    文章

    671

    瀏覽量

    30335
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    340

    瀏覽量

    15081

原文標(biāo)題:痛快!SpringBoot終于幫我們禁止了Spring循環(huán)依賴!

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    ArkUI-X跨平臺(tái)應(yīng)用改造指南

    共通UI抽象并實(shí)現(xiàn),實(shí)現(xiàn)代碼復(fù)用的效果。 4.應(yīng)注意,features層應(yīng)合理設(shè)計(jì)模塊,謹(jǐn)慎處理模塊間依賴關(guān)系,避免循環(huán)依賴等問題。 模塊main Products層harmonyos.hap(下面簡稱
    發(fā)表于 06-16 23:05

    前端開發(fā)中依賴包有問題怎么辦

    在前端開發(fā)中,如果你發(fā)現(xiàn)某個(gè)依賴包存在問題,可以考慮以下步驟來解決: 一、簡單方案 1. 檢查問題來源 : 確認(rèn)問題是否由依賴包引起,而不是你的代碼或其他配置問題。 查看錯(cuò)誤信息、文檔和相關(guān)
    的頭像 發(fā)表于 06-10 11:31 ?98次閱讀

    深入理解C語言:C語言循環(huán)控制

    在C語言編程中,循環(huán)結(jié)構(gòu)是至關(guān)重要的,它可以讓程序重復(fù)執(zhí)行特定的代碼塊,從而提高編程效率。然而,為了避免程序進(jìn)入無限循環(huán),C語言提供了多種循環(huán)控制語句,如break、continue和goto,用于
    的頭像 發(fā)表于 04-29 18:49 ?1151次閱讀
    深入理解C語言:C語言<b class='flag-5'>循環(huán)</b>控制

    技術(shù)干貨驛站 ▏深入理解C語言:嵌套循環(huán)循環(huán)控制的底層原理

    大家好!在上一節(jié)中,我們學(xué)習(xí)了C語言中的基本循環(huán)語句,如for、while和do...while循環(huán)。今天,我們將進(jìn)一步探討嵌套循環(huán)循環(huán)控制,這些技巧可以幫助我們實(shí)現(xiàn)更復(fù)雜的邏輯操作
    的頭像 發(fā)表于 02-21 18:26 ?652次閱讀
    技術(shù)干貨驛站  ▏深入理解C語言:嵌套<b class='flag-5'>循環(huán)</b>與<b class='flag-5'>循環(huán)</b>控制的底層原理

    穩(wěn)定性建設(shè)之依賴設(shè)計(jì)

    作者:京東物流 馮志文 背景 隨著分布式微服務(wù)的發(fā)展,一個(gè)普通的應(yīng)用可能會(huì)依賴于許多其他服務(wù),這給系統(tǒng)的限流降級(jí)、優(yōu)化改造等操作帶來了困難。在沒有明確強(qiáng)弱依賴關(guān)系的情況下,我們很難有效地進(jìn)行這些操作
    的頭像 發(fā)表于 02-21 09:49 ?355次閱讀
    穩(wěn)定性建設(shè)之<b class='flag-5'>依賴</b>設(shè)計(jì)

    火語言如何循環(huán)讀取表格

    描述 從MySQL讀取數(shù)據(jù)(包含列名:id,name,count,create_date)輸出到表格類型變量dt,用For循環(huán)讀取表格每行數(shù)據(jù),通過dt.Rows[i]['id']取表格第i行列
    的頭像 發(fā)表于 02-07 15:11 ?302次閱讀
    火語言如何<b class='flag-5'>循環(huán)</b>讀取表格

    汽輪機(jī)熱力循環(huán)分析

    汽輪機(jī)熱力循環(huán)是熱力工程中的重要部分,以下是對其進(jìn)行的分析: 一、熱力循環(huán)概述 熱力循環(huán)是指工質(zhì)從某一狀態(tài)點(diǎn)開始,經(jīng)過一系列狀態(tài)變化又回到原來這一狀態(tài)點(diǎn)的封閉變化過程。在這個(gè)過程中,工質(zhì)會(huì)經(jīng)
    的頭像 發(fā)表于 02-06 16:52 ?972次閱讀

    可靠性溫度循環(huán)試驗(yàn)至少需要幾個(gè)循環(huán)

    溫度循環(huán)作為自然環(huán)境的模擬,可以考核產(chǎn)品在不同環(huán)境條件下的適應(yīng)能力,常用于產(chǎn)品在開發(fā)階段的型式試驗(yàn)、元器件的篩選試驗(yàn)。一、溫度循環(huán)測試介紹溫度循環(huán)試驗(yàn),也稱為熱循環(huán)試驗(yàn)、高低溫
    的頭像 發(fā)表于 01-23 15:26 ?563次閱讀
    可靠性溫度<b class='flag-5'>循環(huán)</b>試驗(yàn)至少需要幾個(gè)<b class='flag-5'>循環(huán)</b>?

    Simcenter Micred Power Tester功率循環(huán)測試儀

    SimcenterMicredPowerTester功率循環(huán)測試儀使用結(jié)合了有效功率循環(huán)和熱結(jié)構(gòu)退化監(jiān)測的測試硬件,評估功率半導(dǎo)體的熱可靠性和使用壽命。為什么選擇
    的頭像 發(fā)表于 01-09 14:33 ?1013次閱讀
    Simcenter Micred Power Tester功率<b class='flag-5'>循環(huán)</b>測試儀

    深入理解C語言:循環(huán)語句的應(yīng)用與優(yōu)化技巧

    在程序設(shè)計(jì)中,我們常常需要重復(fù)執(zhí)行某一段代碼。為了提高效率和簡化代碼,循環(huán)語句應(yīng)運(yùn)而生。C語言作為一門經(jīng)典的編程語言,提供了多種循環(huán)控制結(jié)構(gòu),幫助程序員高效地實(shí)現(xiàn)重復(fù)操作。掌握循環(huán)語句的使用,不僅
    的頭像 發(fā)表于 12-07 01:11 ?635次閱讀
    深入理解C語言:<b class='flag-5'>循環(huán)</b>語句的應(yīng)用與優(yōu)化技巧

    中微愛芯循環(huán)風(fēng)扇整體解決方案

    循環(huán)風(fēng)扇作為一款家用電器,廣泛應(yīng)用于家庭、辦公室、商鋪等多種室內(nèi)環(huán)境,其核心在于通過高效的空氣循環(huán)技術(shù),實(shí)現(xiàn)室內(nèi)空氣的快速流動(dòng)和循環(huán),提高通風(fēng)效率,為用戶提供舒適的居住環(huán)境。特別是在夏季和需要通風(fēng)
    的頭像 發(fā)表于 11-08 13:36 ?571次閱讀
    中微愛芯<b class='flag-5'>循環(huán)</b>風(fēng)扇整體解決方案

    西門子博途中循環(huán)中斷功能的編程示例

    在以下示例中,將讀取循環(huán)中斷 OB (OB31) 的相位和循環(huán)時(shí)間,并設(shè)置一個(gè)新的循環(huán)時(shí)間。
    的頭像 發(fā)表于 10-28 10:11 ?3607次閱讀
    西門子博途中<b class='flag-5'>循環(huán)</b>中斷功能的編程示例

    掃描速率和濃度對循環(huán)伏安圖有什么影響

    循環(huán)伏安法(Cyclic Voltammetry,CV)是一種電化學(xué)測試技術(shù),它通過在工作電極上施加一個(gè)時(shí)間依賴的電位掃描,從而研究電極反應(yīng)的動(dòng)力學(xué)和機(jī)理。掃描速率和濃度是影響循環(huán)伏安圖的重要因素
    的頭像 發(fā)表于 10-14 14:41 ?3702次閱讀

    功率半導(dǎo)體器件功率循環(huán)測試與控制策略

    功率循環(huán)測試是一種功率半導(dǎo)體器件的可靠性測試方法,被列為AEC-Q101與AQG-324等車規(guī)級(jí)測試標(biāo)準(zhǔn)內(nèi)的必測項(xiàng)目。與溫度循環(huán)測試相比,功率循環(huán)是通過器件內(nèi)部工作的芯片產(chǎn)生熱量,使得器件達(dá)到既定的溫度;而溫度
    的頭像 發(fā)表于 10-09 18:11 ?1005次閱讀
    功率半導(dǎo)體器件功率<b class='flag-5'>循環(huán)</b>測試與控制策略

    冷卻水循環(huán)泵PLC數(shù)據(jù)采集遠(yuǎn)程管理系統(tǒng)方案

    的管理模式依賴于人工實(shí)時(shí)值守和定時(shí)巡查,不僅工作任務(wù)繁重,而且往往難以及時(shí)發(fā)現(xiàn)和解決問題,增加了設(shè)備故障和停機(jī)的風(fēng)險(xiǎn)。為此,PLC在冷卻水循環(huán)系統(tǒng)得到廣泛應(yīng)用,能夠?qū)崿F(xiàn)水溫水壓自動(dòng)控制水泵的啟停,打造無人值守泵房。
    的頭像 發(fā)表于 09-27 13:31 ?740次閱讀
    冷卻水<b class='flag-5'>循環(huán)</b>泵PLC數(shù)據(jù)采集遠(yuǎn)程管理系統(tǒng)方案