- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
你好,我有这样的类定义
public class JdbcInterceptor {
private static final JdbcInterceptor instance = new JdbcInterceptor();
private static ThreadLocal<Boolean> dontIntercept = new ThreadLocal<Boolean>();
public static JdbcInterceptor getInstance() {
return instance;
}
public void skipIntercept() {
dontIntercept.set(true);
}
public boolean interrupt() {
boolean di = dontIntercept.get()!=null?dontIntercept.get().booleanValue():false;
if (di) {
dontIntercept.set(false);
}
return di;
}// end interrupt
}// end class
我在其他类(class)做这个
//class1 stuff
JdbcInterceptor.getInstance().skipIntercept();
if(JdbcInterceptor.getInstance().interrupt())
{ // class1 stuff happens
}
现在我在 class2 做这个
//class2 stuff
if(JdbcInterceptor.getInstance().interrupt())
{ // class2 stuff happens
}
现在我有点困惑,我知道 class1 的事情会发生,因为我设置了不要拦截 ThreadLocal。我怀疑 class2 的东西是否会发生?我的逻辑是,我只有一个 JdbcInterceptor 实例,因此在对 interrupt() 的所有调用中都应该有相同的状态。但有人告诉我,ThreadLocals 对于每个线程都是本地的。我在这里看到了一些冲突。请帮我解决这个问题。
最佳答案
你的问题不是很清楚。
But I have been told that ThreadLocals are local for each thread. I see some conflict here.
这是正确的。没有冲突。使用 ThreadLocal
存储的值对象对于每个线程都是唯一的。它实际上在内部与 Thread
对象一起存储,因此当一个线程终止 all 时,线程局部值也将被删除并可用于垃圾回收,除非有来自其他对象的其他引用线程。
如果您的两个类都使用同一个线程执行,那么除非您在两次调用之间更改本地线程的值,否则两者将具有相同的结果。如果不同的线程执行 class2,那么两者将具有不同的值(根据您的示例)。
您可能混淆了发生在时间和类/方法存储和代码中的线程执行。这两个是非常不同的。一个线程可以执行任何和所有方法,或者您可以让多个线程在一个类中执行相同的方法。您无法在代码中“看到”线程。如果没有其他图片,您必须想象它们 - 这确实需要一些仔细的可视化。
现在您可以使用 ThreadLocal
初始化程序使您的代码更清晰一些,如下所示:
private static ThreadLocal<Boolean> dontIntercept = new ThreadLocal<Boolean>() {
@Override
protected Boolean initialValue() {
return Boolean.FALSE;
}
};
然后当您使用本地线程时,您不必检查它是否为 null
,如下所示:
public boolean interrupt() {
return dontIntercept.get().booleanValue();
}// end interrupt
这里尝试展示如何用更多的两个线程执行:
Thread1 start---class1(skip=false)-+-skip(true)---+class1(true)--+class2(true)----+-end
| | | | |
Thread2 start---+-class1(false)+--------------+class2(false)---+-class1(false)---end
当我显示 classN(val) 时,该值是当时设置的跳过线程局部变量。
为了更具体地回答您的问题,请在本示例中:当线程 1 执行时,class1 和 class2 代码都将被跳过。当由 thread2 执行时,它们不会被跳过。
请注意,还有另一种本地线程称为InheritableThreadLocal
。这在我的示例中会有所不同,因为 Thread2 会在线程启动第二个线程时继承 Thread1 中的值。
编辑 如果您在 class1 中的代码始终将 skip 值设置为 true,那么行为会稍微改变。如果一个线程首先执行 class1,然后执行 class2,那么两者的 skip 都将为 true
。如果线程先执行 class2,然后执行 class1,则 skip 将为前者的 false
和为后者的 true
。您没有证明有一种方法可以将 skip 变回 false
。
编辑 重新阅读您的问题。如果您实际上希望所有线程都处于完全相同的状态,那么您就不会使用 ThreadLocal
。只需使用常规变量并将其标记为 volatile
或使用同步保护它。
关于java - 私有(private)静态最终实例的线程局部行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2160601/
如果我们定义一个像这样的函数 (defun foo(x) (setf x somevalue)) x 定义为局部变量还是全局变量?使用 setf/q 将值设置为全局值。如果它是全局的,谁能告诉我如
仍在学习 MVC3、EF。现在我正在连接到 MySql,但我相信这无关紧要。为简单起见,我决定为我的测试应用程序使用一个数据库,并且我包含了一个类别来区分数据。例如,我有一个新闻、事件、信息和页面类别
假设我定义了以下代码: int *func() { int *p=(int *)malloc(sizeof(int)); // memory is allocated from heap
我正在构建一个小型 PHP MVC,但我在一小部分编码方面碰壁了。我想我需要“局部 View ”,但我也许可以用现有代码实现一些东西。 目前我的 Controller 是最简单的形式: 实例化一个对象
假设我定义了以下代码: int *func() { int *p=(int *)malloc(sizeof(int)); // memory is allocated from heap
我有以下代码(用 Python 2.X 编写): def banana(x): def apple(stuff): x /= 10 return stuff -
我正在尝试重用一些代码,部分 View 似乎是使用 MVC 时执行此操作的最佳方式。 我创建了一个继承自 IEnumerable 的局部 View (见下文)。 @model IEnumerable
局部 const 变量将存储在哪里?我已经验证过,函数中使用 const 变量的每个位置都会被其值替换(如立即值寻址模式)。但如果指针被分配给它,那么它就会存储在堆栈中。在这里我不明白处理器如何知道其
我想将局部变量用作全局变量,有人告诉我这样做的方法是在函数外部创建变量,如下所示: var foo = null; function bar() {
我正在处理一个很长的 Angular 表格。我想知道我是否可以将它分成许多不同的 View 并在主视图中引用它们中的每一个。 First Section
我有一个导航栏,它是一个局部 View ,我需要在设计页面上呈现它,以便用户编辑他们的个人资料。事实上,我只有一个页面,但是添加执行帐户维护的路径搞乱了我的导航栏加载,因为实例变量不存在。无论如何,我
我没有用到全局变量,也从未明确定义过全局变量,但我的代码中似乎有一个。你能帮我把它做成本地的吗? def algo(X): # randomized algorithm while len(X
假设我有这个(当前无返回)函数: def codepoint_convert(text, offset): codepoint = text[offset] if codepoint
我在我的项目中同时使用了局部 View 和布局概念,但我无法区分。但我的感觉是两者都在做同样的工作。任何人都可以通过示例说出有关局部 View 和布局的简要概念以及区别吗? 最佳答案 除了 Josh
使用全局变量会加快速度吗?在英特尔的体系结构软件开发人员手册(关于微处理器)中建议使用局部变量而不是全局变量。但是,请考虑以下代码: void process_tcp_packets(void) {
我有一个局部 View 使用的模型与我在其中呈现它的 View 不同。我不断收到错误消息。 The model item passed into the dictionary is of type '
我在 cshtml 页面上有一个局部 View ,如下所示:- @model MvcCommons.ViewModels.CompositeViewModel @{ ViewBag.Title = "
我在从 while 循环全局更新数组时遇到问题,如下所述。请注意,我只能使用 C 95 及之前版本的功能。任何帮助将不胜感激!满浆箱http://pastebin.com/ss6VgTCD 在我的程序
我想刷新 Json 局部 View 。我正在尝试使用这个: $('#example123').load('@Url.Action("Rejestracja", "Logowanie")'); 但不能正
我有一个 asp.net 页面,它返回我当前正在使用的选项卡中的部分 View 。我已经设置了所有 jQuery 并且可以正常工作。它工作一次并通过 ajax 返回一个局部 View .html(re
我是一名优秀的程序员,十分优秀!