我ThreadLocal
什么时候应该使用变量?
怎么用?
java concurrency multithreading thread-local thread-confinement
我对thread_local
C++ 11中的描述感到困惑.我的理解是,每个线程在函数中都有唯一的局部变量副本.所有线程都可以访问全局/静态变量(可能使用锁进行同步访问).和thread_local
变量的所有线程都是可见的,但只能由他们为其定义线程修改?这是对的吗?
特别是在Python中,如何在线程之间共享变量?
虽然我之前使用threading.Thread
过,但我从未真正理解或看到变量如何共享的例子.它们是在主线和孩子之间共享还是仅在孩子之间共享?我什么时候需要使用线程本地存储来避免这种共享?
我已经看到很多关于通过使用锁来同步线程间共享数据访问的警告,但我还没有看到问题的一个很好的例子.
提前致谢!
[ThreadStatic]
在ThreadLocal<T>
使用泛型时使用属性定义.为什么选择不同的设计方案?在这种情况下使用泛型over属性有哪些优缺点?
从ThreadLocal
变量读取多少比常规字段慢?
更具体地说,简单的对象创建比访问ThreadLocal
变量更快还是更慢?
我认为它足够快,因此ThreadLocal<MessageDigest>
实例比MessageDigest
每次创建实例要快得多.但这也适用于字节[10]或字节[1000]吗?
编辑:问题是在调用ThreadLocal
get 时真正发生的事情?如果那只是一个领域,就像任何其他领域一样,那么答案就是"它总是最快",对吧?
ThreadLocal是如何实现的?它是用Java实现的(使用从ThreadID到对象的一些并发映射),还是使用一些JVM钩子来更有效地执行它?
有没有人有一个例子如何做到这一点?它们是由垃圾收集器处理的吗?我正在使用Tomcat 6.
在多个帖子中提到:不当使用ThreadLocal
原因内存泄漏.我正在努力了解内存泄漏将如何发生ThreadLocal
.
我发现它的唯一情况如下:
Web服务器维护一个线程池(例如,用于servlet).如果
ThreadLocal
没有删除变量,那些线程可以创建内存泄漏,因为线程没有死亡.
这种情况没有提到"Perm Space"内存泄漏.这是内存泄漏的唯一(主要)用例吗?
我正在使用线程本地来存储当前用户和请求对象.通过这种方式,我可以轻松访问程序中任何位置的请求(例如动态表单),而无需传递它们.
为了在中间件中实现线程本地存储,我遵循了Django站点上的教程:http: //code.djangoproject.com/wiki/CookBookThreadlocalsAndUser?version = 18
此文档已经过修改,建议避免使用此技术:http: //code.djangoproject.com/wiki/CookBookThreadlocalsAndUser?version = 20
来自文章:
从设计的角度来看,threadlocals本质上是全局变量,并且受到全局变量通常需要的所有常见的可移植性和可预测性问题的影响.
更重要的是,从安全角度来看,threadlocals构成了巨大的风险.通过提供公开其他线程状态的数据存储,您可以为Web服务器中的一个线程提供一种方法来潜在地修改系统中另一个线程的状态.如果线程本地数据包含用户或其他与身份验证相关的数据的描述,则该数据可以用作授予对未授权用户的访问权的攻击的基础,或者暴露用户的私有细节.虽然有可能建立一个可以抵御这种攻击的线程局域系统,但是防御起来要容易得多,并且建立一个不受任何此类漏洞影响的系统.
我理解为什么全局变量可能很糟糕,但在这种情况下,我在自己的服务器上运行自己的代码,所以我看不出两个全局变量带来的危险.
有人可以解释涉及的安全问题吗?我问过很多人,如果他们阅读这篇文章并知道我正在使用线程本地人,他们会如何破解我的应用程序,但没有人能告诉我.我开始怀疑这是一个由分裂的纯粹主义者所持的观点,他们喜欢明确地传递物品.
当我阅读scalatra的来源时,我发现有一些代码如下:
protected val _response = new DynamicVariable[HttpServletResponse](null)
protected val _request = new DynamicVariable[HttpServletRequest](null)
Run Code Online (Sandbox Code Playgroud)
有一个有趣的课程名称DynamicVariable
.我看过这堂课的文件,但我不知道何时以及为什么要使用它?它有一个withValue()
通常使用的.
如果我们不使用它,那么我们应该使用什么代码来解决它解决的问题?
(我是scala的新手,如果你能提供一些代码,那就太好了)
thread-local ×10
java ×5
python ×2
attributes ×1
c# ×1
c++ ×1
c++11 ×1
concurrency ×1
django ×1
generics ×1
memory-leaks ×1
performance ×1
permgen ×1
scala ×1
threadstatic ×1
tomcat ×1