谈一谈编程中遇到的一些死循环(递归死循环,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。导致文件状态更改引发死循环。

posted @ 2018-11-01 12:01  大火yzs  阅读(2222)  评论(0编辑  收藏  举报