java 递归改非递归_使用Java ThreadLocals的意外递归保护

java 递归改非递归

对于那些使用第三方工具来尝试扩展它们而又不完全了解它们的人来说,这是一个小技巧。 假定以下情况:

  • 您想扩展一个展示分层数据模型的库(假设您要扩展Apache Jackrabbit )
  • 该库在访问内容存储库的任何节点之前会内部检查访问权限
  • 您想实现自己的访问控制算法
  • 您的访问控制算法将访问内容存储库的其他节点
  • …进而会再次触发访问控制
  • …进而将再次访问内容存储库的其他节点

…无限递归,如果不递归广度优先,则可能导致StackOverflowError 。

现在,您有两个选择:

  1. 花时间,坐下来,了解内部原理,并正确地做。 到达自己的扩展名后,您可能不应该递归到访问控制中。 在扩展Jackrabbit的情况下,这可以通过使用系统会话在访问控制算法中进一步访问节点来完成。 系统会话通常绕过访问控制。
  2. 要急躁,想要快速获得结果,并通过技巧来防止递归

当然,您确实应该选择选项1。但是,谁有时间了解所有内容?

这是实现该技巧的方法。

/*** This thread local indicates whether you've* already started recursing with level 1*/
static final ThreadLocal<Boolean> RECURSION_CONTROL= new ThreadLocal<Boolean>();/*** This method executes a delegate in a "protected"* mode, preventing recursion. If a inadvertent* recursion occurred, return a default instead*/
public static <T> T protect(T resultOnRecursion,Protectable<T> delegate)
throws Exception {// Not recursing yet, allow a single level of// recursion and execute the delegate onceif (RECURSION_CONTROL.get() == null) {try {RECURSION_CONTROL.set(true);return delegate.call();}finally {RECURSION_CONTROL.remove();}}// Abort recursion and return earlyelse {return resultOnRecursion;}
}/*** An API to wrap your code with*/
public interface Protectable<T> {T call() throws Exception;
}

如下面的用法示例所示,这很容易工作:

public static void main(String[] args)
throws Exception {protect(null, new Protectable<Void>() {@Overridepublic Void call() throws Exception {// Recurse infinitelySystem.out.println("Recursing?");main(null);System.out.println("No!");return null;}});
}

main()方法的递归调用将被保护方法终止,并提早返回,而不是执行call() 。 也可以通过使用ThreadLocals Map进一步详细说明此思想,允许指定各种键或上下文以防止递归。 然后,您还可以将Integer放入ThreadLocal ,在递归时将其递增,最多允许N个递归级别。

static final ThreadLocal<Integer> RECURSION_CONTROL= new ThreadLocal<Integer>();public static <T> T protect(T resultOnRecursion,Protectable<T> delegate)
throws Exception {Integer level = RECURSION_CONTROL.get();level = (level == null) ? 0 : level;if (level < 5) {try {RECURSION_CONTROL.set(level + 1);return delegate.call();}finally {if (level > 0)RECURSION_CONTROL.set(level - 1);elseRECURSION_CONTROL.remove();}}else {return resultOnRecursion;}
}

但是再说一次。 也许您只需要花几分钟时间,并了解主机库的内部原理是如何工作的,并从一开始就将事情做好……与往常一样,在应用技巧和黑客时!

参考:在Java,SQL和JOOQ博客上,我们的JCG合作伙伴 Lukas Eder 提供了Java ThreadLocals的意外递归保护 。

翻译自: https://www.javacodegeeks.com/2013/04/inadvertent-recursion-protection-with-java-threadlocals.html

java 递归改非递归

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348873.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大连理工18秋计算机应用基础,大连理工大学网络教育本科计算机应用基础入学考试模拟题...

大连理工大学网络教育本科计算机应用基础入学考试模拟题一、单选题1. 世界上第一台电子数字计算机采用的电子器件是______。A.大规模集成电路 B.集成电路C.晶体管 D.电子管2. 将计算机分为巨型机、大中型机、小型机、微型机、工作站等五类的分类标准是______。A.计算机处理数据…

构造函数还是静态工厂方法?

我相信Joshua Bloch在他的非常好的书“ Effective Java”中首先说了它&#xff1a;与构造函数相比&#xff0c;静态工厂方法是实例化对象的首选方法。 我不同意。 不仅因为我相信静态方法是纯粹的邪恶&#xff0c;而且主要是因为在这种特殊情况下&#xff0c;它们伪装成好的方法…

html vue分页,Vue.js bootstrap前端实现分页和排序

写之前先抱怨几句。本来一心一意做.net开发的&#xff0c;渐渐地成了只做前端。最近项目基本都用java做后台&#xff0c;我们这些.net的就成了前端&#xff0c;不是用wpf做界面&#xff0c;就是用html写web页面。深知自己前端技术不足&#xff0c;以前虽说用asp.net前后台都做&…

福建计算机及应用专业的大学,33所福建大学公布国家级/省级一流本科专业!

近日&#xff0c;教育部发布《教育部办公厅关于公布2020年度国家级和省级一流本科专业建设点名单的通知》。据悉&#xff0c;本次教育部一流本科专业建设“双万计划”评选共认定了3977个国家级一流本科专业建设点&#xff0c;其中中央赛道1387个、地方赛道2590个&#xff0c;并…

高度有用的Java ChronoUnit枚举

几年前&#xff0c;我发表了博客文章“ The Highly有用的Java TimeUnit Enum ”&#xff0c;其中介绍了JDK 5引入的TimeUnit枚举。 JDK 8引入了一个更新的枚举ChronoUnit &#xff0c;它比TimeUnit更适合于诸如日期/时间操作等并发以外的上下文。 位于所述java.time.temporal包…

计算机管理ap,如何设置AC功能管理无线AP

AC功能管理无线AP第一步、连接ap举例型号TL-ER6520G不同类型的AP供电方式可能有所差异&#xff0c;包括直流电源供电和网线供电(PoE供电)两种。如下[1] 直流电源供电使用自带的电源适配器给AP供电&#xff0c;要求AP安放位置必须有电源插座&#xff0c;优点是节省成本。按照拓扑…

代表机械 计算机技术的颜色,基于机器视觉识别的交通灯控制系统

1、引言机器视觉又称计算机视觉&#xff0c;是用计算机来实现人的视觉功能&#xff0c;也就是用机器代替人眼来做测量和判断。机器视觉技术包含光源照明技术、光成像技术、传感器技术、数字图像处理技术、机械工程技术、检测控制技术、模拟与数字视频技术、计算机技术、人机接口…

java开发者工具开源版_JArchitect对Java开源贡献者免费

java开发者工具开源版JArchitect是用于Java代码库的静态分析工具&#xff0c;它提供交互式GUI和HTML报告&#xff0c;用于查找代码中过于复杂或有问题的区域&#xff0c;执行分析以重构并比较随时间的变化。 在版本3中&#xff0c;添加了类似LINQ的查询语言&#xff0c;该工具使…

有没有查计算机组成的答案得,计算机组成答案.doc

黄淮学院计算机科学系2008—2009年第二学期2007级《计算机组成原理》期终试卷(A)参考答案及评分标准命题人&#xff1a;王晓涓注意事项&#xff1a;本试卷适用于2007级软件工程专业本科学生使用一、单项选择题(每题1分、共15分)1、B 2、B 3、A 4、D 5、A 6、D 7、D 8、C 9、C 1…

使用JDK 8将收藏转换为地图

我多次遇到这样的情况&#xff0c;希望将多个对象存储在Map中而不是Set或List中&#xff0c;因为将唯一标识信息的Map应用于对象有一些优势 。 Java 8使用流和Collectors.toMap&#xff08;…&#xff09;方法使翻译变得比以往更加容易。 使用Map而不是Set的一种有用情况是&am…

计算机上没有启动程序怎么办,Win7开机不加载启动项怎么办

现在的电脑为了受到更好的保护&#xff0c;往往在开机的时候就加载了一些启动项&#xff0c;如&#xff1a;杀毒软件&#xff0c;安全卫士等等。可有时候会发现&#xff0c;在Win7操作系统中&#xff0c;安装后发现不能开机加载启动项。在注册表中&#xff0c;在msconfig中&…

车牌识别与计算机编程,基于计算机视觉的车牌字符识别技术的研究

摘要&#xff1a;车牌识别系统是现代智能交通管理系统的核心组成部分,是图像处理、神经网络和模式识别等技术的综合应用。 本文介绍了车牌识别系统的一般构成,包括车牌图像预处理、车牌字符分割和车牌字符识别等三个重要组成部分,并分别进行深入研究。 车牌图像预处理方面,针对…

线程同步,线程不同步_重新同步多线程集成测试

线程同步,线程不同步我最近在Captain Debug的Blog上偶然发现了一篇文章“ 同步多线程集成测试 ”。 那篇文章强调了设计涉及异步运行业务逻辑的被测类的集成测试的问题。 给出了这个人为的示例&#xff08;我删除了一些评论&#xff09;&#xff1a; public class ThreadWrapp…

用户需求测试软件,用户需求和软件需求的区别

原标题&#xff1a;用户需求和软件需求的区别一些刚实施GJB5000A组织的开发人员&#xff0c;不是很理解软件研制任务书和软件需求规格说明的区别。这里再次解读下这个问题。软件研制任务书就是用户需求&#xff0c;而用户需求是从用户的角度&#xff0c;用用户熟悉的语言进行描…

在Java中使用可信时间戳

受信任的时间戳记是使受信任的第三方&#xff08;“时间戳记权威”&#xff0c;TSA&#xff09;以电子形式证明给定事件的时间的过程。 欧盟法规eIDAS赋予了这些时间戳合法的力量-即&#xff0c;如果事件带有时间戳&#xff0c;则没有人可以质疑事件的时间或内容。 它适用于多种…

无限滚动重置服务器,简单无限滚动的实现

在使用elementUI组件库的时候&#xff0c;用到了无限滚动这个功能。我没有看源码&#xff0c;直接在网上学习了下实现的思路&#xff0c;然后自己手动编码以下。在此总结下。假设页面上有一个盒子容器&#xff0c;容器内有一些子元素。容器的高度是固定的&#xff0c;有纵向滚动…

java配置openjdk_Java大新闻不断涌现:Java SE 6和OpenJDK

java配置openjdk我最近公布的最新的Java 8新闻 &#xff0c;总结了一些最近的事态发展中的Java 8 。 自从发布该文章不到一周&#xff0c;就发布了更多重要的Java新闻报道&#xff0c;我在本文中总结了其中的一些内容。 共同的主题包括不同的Java SE 6实现和OpenJDK 。 Java安…

Fatjars,Thinwars以及为什么OpenLiberty很酷

法特哈斯 构建一个Fatjar&#xff08;或Uberjar&#xff09;&#xff0c;其中包含将应用程序很好地打包在一起运行所需的一切&#xff0c;这意味着您可以&#xff1a; java -jar myapp.jar然后离开。 没有应用程序服务器。 没有类路径。 这种方法已经被诸如Springboot之类的微…

Spring Cloud Config Server简介

1.概述 在本教程中&#xff0c;我们将回顾Spring Cloud Config Server的基础知识。 我们将设置一个Config Server &#xff0c;然后构建一个客户端应用程序 &#xff0c;该客户端应用程序在启动时会消耗配置 &#xff0c;然后刷新配置而不重新启动。 我们正在构建的应用程序与《…

朴素贝叶斯算法实现分类以及Matlab实现

开始 其实在学习机器学习的一些算法&#xff0c;最近也一直在看这方面的东西&#xff0c;并且尝试着使用Matlab进行一些算法的实现。这几天一直在看得就是贝叶斯算法实现一个分类问题。大概经过了一下这个过程&#xff1a; 看书→算法公式推演→网上查询资料→进一步理解→搜…