jjzjj

Threadlocal

全部标签

ThreadLocal的内存泄露问题

ThreadLocal的内部实现在每一个线程Thread对象中,都维护了一个ThreadLocalMap对象。ThreadLocalMap中又维护了一个kv形式的Entry对象,key指向了当前ThreadLocal对象,value就是我们实际在ThreadLocal中存储的值。注意,这里的Entry中的key存放是ThreadLocal的弱引用。实现指的是强引用,虚线指的是弱引用。其实际上,ThreaLocal本身是不存储值的,我们在使用其对应的set、get方法时,都是操作的其对应的ThreadLocalMap对象。为什么会出现内存泄露?从上述可以看到,在Entry中的key存储的Thre

c# - ThreadLocal<T> 和静态方法?

正在使用类名访问静态字段,如下所示:publicclassMe(){publicstaticinta=5;}我可以使用Me.a访问它,因此它附加到类。但是当我看到:staticThreadLocal_x=newThreadLocal(()=>3);它保证每个线程看到_x的不同副本。我们不是刚刚看到static是每个class而不是每个thread吗?ThreadLocal如何设法为每个线程提供不同的_x副本? 最佳答案 Didntwejustseethatstaticisperclassandnotperthread?是的。所以想象

java - java 中的 volatile 与 threadLocal

让我们以SimpleDateFormat为例,因为它不是线程安全的。我可以像这样使用threadLocal允许每个线程拥有自己的SimpleDateFormat副本:privatestaticfinalThreadLocalformatter=newThreadLocal(){@OverrideprotectedSimpleDateFormatinitialValue(){returnnewSimpleDateFormat("yyyyMMddHHmm");}};但是volatile关键字保证线程将拥有变量的最新副本。所以我可以不这样做吗:volatileSimpleDateFormat

java - 将线程安全对象放在 ThreadLocal 上有什么好处吗?

我最近看到一段代码,它使用了一个ThreadLocal对象并在其中保存了一个ConcurrentHashMap。这有什么逻辑/好处,还是多余的? 最佳答案 如果对并发散列图的唯一引用驻留在ThreadLocal中,则散列图显然仅从单个线程引用。在这种情况下,我会说它是完全多余的。然而,不难想象有人与其他线程“共享”线程本地存储的HashMap:ThreadLocal>tl=...//...finalConcurrentHashMapprops=tl.get();EventQueue.invokeLater(newRunnable()

java - Oracle 驱动程序内存泄漏 - Tomcat

我们使用的是tomcat-7.0.33。Spring3.0.1和JPA使用tomcatJNDI数据源。Oracle10g在后端使用ojdbc6.jar(最新)。当我们尝试取消部署应用程序时,某些Oracle类似乎正在泄漏。我在使用较旧的ojdbc14.jar驱动程序时看不到这一点,但我们无法使用这些驱动程序,因为我们正在迁移到需要较新驱动程序的Oracle11g。我猜这是Oracle驱动程序中的错误?我可以做些什么来清理这些资源吗?我试过关闭数据库连接池和其他东西都无济于事......不使用Tomcat的连接池会更好吗?我们宁愿让服务器连接到数据库,但如果需要,我们可以自己做...服务

java - 为什么 ThreadLocal 变量需要静态化?

我已经阅读了很多关于为什么ThreadLocal变量需要是静态的(虽然不是必需的)的文章,但我不明白为什么它应该是静态的。我读过here和许多其他链接但没有明白这一点。我做过这样的事publicclassThreadLocalDemo{publicstaticvoidmain(String[]args)throwsException{SharedRersourcer1=newSharedRersource();Threadt1=newThread(r1);Threadt2=newThread(r1);t1.start();t2.start();t1.join();t2.join();S

java - 对 ThreadLocal 感到困惑

我今天早上才知道ThreadLocal。我读到它应该始终是最终的和静态的,例如:privatestaticfinalThreadLocalthreadLocal=newThreadLocal();(Session是一个HibernateSession)我的困惑是:因为它是静态的,它对JVM中的任何线程都是可用的。然而,它将保存访问它的每个线程的本地信息?我正在努力解决这个问题,所以如果不清楚,我深表歉意。应用程序中的每个线程都可以访问同一个ThreadLocal对象,但是ThreadLocal对象将存储每个线程本地的对象? 最佳答案

java - Java的Threadlocal是否可以应用于非静态字段,如果可以,如何?

ThreadLocal确保一个字段对于一个线程是全局的和局部的。(全局是因为它可用于线程中的所有方法,而局部是因为它仅限于该线程的堆栈。)这对我来说意义不大,因为每个线程的堆栈都仅限于该线程。所以它已经是'threadlocal',对吧?那为什么我们需要ThreadLocal呢?-在进一步阅读时,我证实了我从各个网站(其中大部分网站未能提供这些事实或相互矛盾)的假设,即这确实适用于静态字段。这确实有道理。所以我的问题是,是否存在可以/需要将ThreadLocal应用于非静态字段的多线程场景?(我发现一些网站说“ThreadLocal”是“主要”用于静态字段;甚至https://docs

java - 如何在不实际执行的情况下测试 ThreadLocal 是否已初始化?

我想测试一个ThreadLocal是否已经被初始化,而不是实际初始化它。当然,代码需要是线程安全的。理想情况下,我想要这样的东西:classTestableThreadLocalextendsThreadLocal{publicbooleanisInitialized(){...}}但是我该如何实现这个方法呢?编辑:动机:我将ThreadLocal子类化以覆盖initialValue()。但是,我并不总是需要初始化,特别是因为它可能会导致多类加载器环境中的内存泄漏。一个简单的测试将帮助我编写代码以避免意外初始化。 最佳答案 我倾向于

java - 关于使用 ThreadLocals 包装可变单例对象的建议

来自JavaConcurrencyinpractice第3.3.3章。线程本地Thread-localvariablesareoftenusedtopreventsharingindesignsbasedonmutableSingletonsorglobalvariables.如果我们将可变的Singleton人包装在ThreadLocal中,每个线程都会有自己的Singleton副本?那么它将如何保持单例?这是作者的意思还是我在这里遗漏了一些非常明显的东西? 最佳答案 IfwewrapthemutableSingletonguyi