谈一谈编程中遇到的一些死循环(递归死循环,AOP死循环,业务死循环)
Posted bigfire
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了谈一谈编程中遇到的一些死循环(递归死循环,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。导致文件状态更改引发死循环。
以上是关于谈一谈编程中遇到的一些死循环(递归死循环,AOP死循环,业务死循环)的主要内容,如果未能解决你的问题,请参考以下文章
MYSQL 8.019 CTE 递归查询怎么解决死循环三种方法