使用Java ThreadLocals的意外递归保护

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

  • 您想扩展一个公开分层数据模型的库(假设您要扩展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

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

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

相关文章

今日头条竞价接口转发

一、代码 ①类名 public class TouTiao{public class model{public string site_id { get; set; }public string ad_id { get; set; }public List<Data> data { get; set; }}public class Data{public string label { get; set; }public string lable { get; set; }publi…

art-template辅助函数和子模板

art-template 前端使用 用途&#xff1a;主要用来处理数据和优化性能&#xff0c;与其他的一些模块化处理数据的插件相比&#xff0c;art-template处理性能好 不废话&#xff0c;上代码 1.art-template基本语法使用 <script src"template.js"></script&…

微处理器 微型计算机系统,作业答案11微处理器微型计算机和微型计算机系统三者之间.DOC...

作业答案11微处理器微型计算机和微型计算机系统三者之间第1章 作 业 答案1.1 微处理器、微型计算机和微型计算机系统三者之间有什么不同?把CPU(运算器和控制器)用大规模集成电路技术做在一个芯片上,即为微处理器。微处理器加上一定数量的存储器和外部设备(或外部设备的接口)构…

C# 对轻量级(IoC Container)依赖注入Unity的使用

概述 Unity是一个轻量级的可扩展的依赖注入容器&#xff0c;支持构造函数&#xff0c;属性和方法调用注入。Unity可以处理那些从事基于组件的软件工程的开发人员所面对的问题。构建一个成功应用程序的关键是实现非常松散的耦合设计。松散耦合的应用程序更灵活&#xff0c;更易于…

为什么同步的StringBuffer从来都不是一个好主意

介绍 StringBuffer是用于可变字符串的同步类。 使其同步的主要问题是 它通常用作局部变量&#xff0c;因此使其同步只会使其变慢。 以多线程方式使用它从来不是一个好主意。 这个问题是开发人员认为使用StringBuffer的方法在不使用时本身就是线程安全的。 StringBuffer的问题…

大工20秋计算机组成原理在线作业2,大工14秋《计算机组成原理》在线作业2答案...

大工14秋《计算机组成原理》在线作业2单选题 判断题一、单选题(共 10 道试题&#xff0c;共 50 分。)1. 存储周期是指( )。A. 存储器的读出时间B. 存储器的写入时间C. 存储器进行连续读或写操作所允许的最短时间间隔D. 存储器进行连续读或写操作所允许的最长时间间隔正确答案&a…

css清除浮动

css设计浮动属性的主要目的&#xff0c;是为了实现文本绕排图片的效果。 一.浮动 当浮动一张图片或者其他元素时&#xff0c;浏览器会将浮动元素往上方推&#xff0c;直到它碰到父元素的内边界。后面的元素不再认为浮动元素在文档流中位于它的前面了&#xff0c;因为它就会占…

gitlab搭建配置;ssh配置;

1.centos7上搭建gitlab&#xff0c;过程略&#xff1b; 命令&#xff1a;gitlab-ctl [start] [stop] [restart] [reconfigure] [tail] 查看gtilab日志 [status] 查看gitlab运行状态信息 2.修改默认ip端口&#xff1a; vim /etc/gitlab/gitlab.rb &#xff1b; external_url h…

5月学习总结(Ant-Design,mustache,require.js,grunt)

一、Ant-Design学习 因为Ant-Design是基于React实现的&#xff0c;之前自己也学过一段时间的React&#xff0c;对React还是相对比较熟悉的&#xff0c;在学习Ant-Design也还不算吃力。 最开始是从源码看起&#xff0c;从最简单的Icon组件看的&#xff0c;然后连续看了几个组件就…

使用NoSQLUnit测试Spring Data Neo4j应用程序

Spring Data Neo4j是Spring Data项目中的项目&#xff0c;它提供了Spring编程模型的扩展&#xff0c;用于编写使用Neo4j作为图形数据库的应用程序。 要使用NoSQLUnit为Spring Data Neo4j应用程序编写测试&#xff0c;除了考虑Spring Data Neo4j在图形节点和关系中使用一种称为t…

家用计算机历史记录,教您如何查看电脑使用记录

很多朋友想查看自己之前使用过的文件或者文档来查询资料&#xff0c;或者是想看电脑是否被人使用过&#xff0c;但是&#xff0c;如何查看电脑使用记录呢&#xff1f;下面系统之家小编教大家查看电脑使用记录小技巧&#xff0c;不用担心找不到电脑使用记录。希望对大家有所帮助…

html5 图片上传 预览

<html><body><fieldset> <legend>测试</legend> <div class"form-group"> <div class"img-preview rl"> <form id"index_form1" name"index_form1" role"form" method"p…

使用selenium前学习HTML(3)— 属性

<!--HTML标签可以拥有属性&#xff0c;属性提供元素的更多的信息&#xff1b;属性总是以名称/值对的形式出现&#xff0c;比如&#xff1a;name"value"。属性总是在 HTML 元素的开始标签中规定。 --><!DOCTYPE html> <html lang"en"> &l…

k3 Bos开发百问百答

K/3 BOS开发百问百答 &#xff08;版本&#xff1a;V1.1&#xff09; K3产品市场部 目录 一、基础资料篇__ 1 【摘要】bos基础资料的显示问题_ 1 【摘要】单据自定义无法看到bos定义的基础资料_ 1 【摘要】在调出基础资料序时簿时&#xff0c;过滤出我需要的基础资料_ 1 【摘要…

计算机架构专业排名,全国大学计算机专业排名(转贴)

4 东北大学 A 081201计算机系统结构 081200计算机科学与技术 08工学5 西安交通大学 A 081201计算机系统结构 081200计算机科学与技术08工学6 复旦大学 A 081201计算机系统结构 081200计算机科学与技术 08工学7 中国科学技术大学 A 081201计算机系统结构 081200计算机科学与技术…

Spring MVC,Ajax和JSON第2部分–服务器端代码

在上一个博客中&#xff0c;我说过我将谈论Spring&#xff0c;Ajax和JSON&#xff0c;但是没有。 原因是我想使用&#xff08;很少&#xff09;可信的购物网站场景来设置场景。 在这种情况下&#xff0c;当用户单击“电子商务”页面链接时&#xff0c;服务器应用程序将加载目录…

Python模块学习之解决selenium的“can't access dead object”错误

问题描述 在python执行过程中&#xff0c;提示selenium.common.exceptions.WebDriverException: Message: TypeError: cant access dead object 原因 原因是代码中用到了frame,获取元素前需要切换到frame才能定位到元素&#xff0c;否则无法定位到元素 解决方法 在查找元素前加…

初中生学计算机网络应用怎么样,初中生读计算机网络技术专业怎么样?小编解答...

初中生读计算机网络技术专业怎么样?可以这样说&#xff0c;计算机网络技术专业在众多专业当中来说&#xff0c;也是一个发展得比较不错的专业&#xff0c;而且现在也有很多高职学校都开设有计算机网络技术专业&#xff0c;那么初中生读计算机网络技术专业怎么样?计算机网络技…

类的无参方法和Doc注释

一:Java Doc注释: 语法: /** *AccpSchool 类 *author JadeBird *version 1.0 2018/5/26 */ Java Doc是前Sun公司提供的一种技术,它能够从程序代码中抽取类,方法,成员等的注释,形成一个和源代码配套的API帮助文档(简答地说,就是介绍该类,类的方法和成员变量的文档). 因此只要在编…

html/css学习笔记(一)

盒子模型1.background 1.1background-colorbackground-image: url("");background-repeatbackground-size: &#xff08;x轴的比例 y轴的比例&#xff09;background-positionbackground-attachment:fixed;(背景图固定不滚动)1.2 复合写法background: color iamge po…