談一談編程中遇到的一些死循環(遞歸死循環,AOP死循環,業務死循環)


 

最簡單最基礎死循環,一般都是這樣的

while(1)  while(true)  for( ; ; )……

然而在編程中常常會用到一些並不是那么基礎的死循環,

這里列舉一些我在編程中所遇到的一些死循環

方法已經不記得了,只是大概說明。

 

 

1(遞歸死循環)

 

 

2(AOP死循環)

這個是遞歸死循環的變種

學習Spring的同學都知道AOP面向切面編程,

記得網上讀過一篇博客說的是Spring中實現AOP不僅用到了jdk1.6的動態Proxy還使用了CGLIB。就可以實現接口和實體類都能被動態代理。

對動態代理一直不太了解。有天閑着無聊就試着了解一下:

CGLIB(Code Generation Library)詳解

https://blog.csdn.net/danchu/article/details/70238002

自己在網上找了幾篇文章看了一下,自己動手試試寫個 JDBC的事務注解  Transaction

 

這張圖不知道能不能大概說明意思,意思大概就是使用CGLIB進行動態代理的時候,注意盡量別調用被代理對象的toString方法。否則會間接遞歸死循環。

 

3(文件狀態更新死循環,這個有點極端,可能大家不會碰見)

這個是業務邏輯的系循環

大二的時候學安卓,用的是AndroidStudio 當時學校有一個比賽聯想智能交通的比賽,需要三個人用安卓坐一個app。當時思考一個問題,三個人做一個app一定在一個局域網下做一個app的,那么我能不能做個軟件讓三個人同時去操作一個項目。

思路是這樣的:

后台運行一個線程一直去遍歷一個指定的項目內的所有文件。如果一個文件的文件內容近期更改過。那就把文件發給好友。好友把更改的文件內容寫入到文件上去即可,。當然這些讀寫內容也都是后台線程完成的。

后來呢,這個東西的確也做出來了,但是呢,有編碼問題,后來就沒再管了。

同時里面有關於死循環的兩個問題值得思考

 

(1)子線程中就需要一個死循環,這個死循環的做用就是用來一直遍歷文件和查看文件更改狀態。當然這個死循環是一個正常的死循環,是我們所需要的死循環,無非就是損耗了軟件的性能

后來在網上查到一個文件監聽器的類。

WatchService watcher = FileSystems.getDefault().newWatchService();

這個類使用了觀察者模式。不需要再使用死循環了,無疑提高了軟件的性能。

 

(2)另一個死循環發生在文件讀寫時。

本來時當文件發生改變的時候發送文件到好友哪里去,由於每個客戶端有相同的功能。

那么問題就出在這里,當A的文件發生改變時,發送到B上去后,B把能讓更新到本地后那么本地文件又發生了改變,B就會把這個跟A一模一樣的文件再此發生給A。導致文件狀態更改引發死循環。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM