Tag: thread local

Servlet中的SimpleDateFormat

我在Servlet中使用了很多SimpleDateFormat对象。 不幸的是,SimpleDateFormat不是线程安全的。 因此,我考虑用ThreadLocal包装它以促进SimpleDateFormat对象的重用。 我写了一个util-class来启用它: public class DateUtil { private final static ThreadLocal dateFormat = new ThreadLocal() { return new SimpleDateFormat(); } public static SimpleDateFormat get () { return dateFormat.get(); } } 实际上,这似乎导致内存泄漏。 关闭我的webapp时,Tomcat会记录以下错误消息: 严重:Web应用程序[]使用[null]类型的键创建了一个ThreadLocal(值[com.example.util.DateUtil$2@50242f7d]),类型为[java.text.SimpleDateFormat](value [java.text] .SimpleDateFormat @ d91b489b])但在Web应用程序停止时无法将其删除。 这很可能造成内存泄漏。 我理解内存泄漏的原因,但是在Servlet中处理SimpleDateFormat-objects(或任何其他非线程安全对象)的最佳方法是什么?

java.lang.Thread中的新增附加字段,有什么想法?

在Java 8中, java.lang.Thread类有3个新字段: /** The current seed for a ThreadLocalRandom */ @sun.misc.Contended(“tlr”) long threadLocalRandomSeed; /** Probe hash value; nonzero if threadLocalRandomSeed initialized */ @sun.misc.Contended(“tlr”) int threadLocalRandomProbe; /** Secondary seed isolated from public ThreadLocalRandom sequence */ @sun.misc.Contended(“tlr”) int threadLocalRandomSecondarySeed; 正如它在Javadoc中所说的那样,它是由java.util.concurrent.ThreadLocalRandom类专门管理的。 此外,在ThreadLocalRandom它们以非常奇怪的方式使用: SEED = UNSAFE.objectFieldOffset (tk.getDeclaredField(“threadLocalRandomSeed”)); PROBE = UNSAFE.objectFieldOffset (tk.getDeclaredField(“threadLocalRandomProbe”)); SECONDARY = UNSAFE.objectFieldOffset (tk.getDeclaredField(“threadLocalRandomSecondarySeed”)); (在LockSupport类中也LockSupport相同的代码段)。 然后这个偏移在内部用于几个java.concurrent地方。 这个想法是什么? […]

如何在Java中初始化ThreadLocal对象

我有一个问题,我正在创建一个ThreadLocal并使用新的ThreadLocal初始化它。 问题是,我在概念上只想要一个持久的列表,这个列表会延续线程的生命,但我不知道是否有办法在Java中初始化每个线程的东西。 例如,我想要的是: ThreadLocal static { myThreadLocalVariable.set(new ArrayList()); } 这样它就可以为每个线程初始化它。 我知道我可以这样做: private static Whatever getMyVariable() { Whatever w = myThreadLocalVariable.get(); if(w == null) { w = new ArrayList(); myThreadLocalVariable.set(w); } return w; } 但是每次使用它时我真的不需要检查它。 我能在这做什么更好的事情吗?

为什么ThreadLocal实用程序总是在Spring MVC应用程序中返回null?

我编写了这个实用程序类来保存Spring MVC应用程序中的临时数据: public abstract class FooUtil { private static final ThreadLocal threadFoo = new ThreadLocal(); public static String getFooId(){ return threadFoo.get(); } public static void setFooId(String fooId){ threadFoo.set(fooId); } public static void removeFooId(){ threadFoo.remove(); } } 所以我调用FooUtil.setFooId(“foo”) 。 但是当我稍后调用FooUtil.getFooId() ,它总是返回null 。 我需要一个构造函数吗? 或者这不应该是一个抽象类? 我不知道。

Threadpool中的Threadlocal内存泄漏

我在Tomcat中收到threadlocal内存泄漏错误,我正在使用ThreadPool,但在我的webapp中没有ThreadLocal的实现。 严重:Web应用程序[/ myWebApp]创建了一个ThreadLocal,其键类型为[org.a pache.http.impl.cookie.DateUtils $ DateFormatHolder $ 1](value [org.apache.http.imp l.cookie.DateUtils $ DateFormatHolder $ 1 @ 4c2849])和类型为[java.lang.re f.SoftReference]的值(值[java.lang.ref.SoftReference@1e67280])但在Web应用程序停止时无法重新调用它。 线程将会更新并且有时间尝试避免可能的内存泄漏。 我不明白为什么我得到线程局部错误,虽然我没有实现它? 我想摆脱这些消息,所以我搜索了网络,并在这里写道,为了清理threadlocal我需要使用: ThreadLocal.remove() 但我没有ThreadLocal的实现..如果有人给我指路,我将不胜感激。

变量的同步和本地副本

我正在查看一些具有以下习语的遗留代码: Map myMap = someGlobalInstance.getMap(); synchronized (myMap) { item = myMap.get(myKey); } 我从Intelli-J的代码检查得到的警告是: Synchronization on local variable ‘myMap’ 这是适当的同步吗?为什么? Map myMap = someGlobalInstance.getMap(); synchronized (someGlobalInstance.getMap()) { item = myMap.get(myKey); }

ThreadLocal是否可以安全地与Tomcat NIO Connector一起使用

在负载测试期间测试Tomcat NIO连接器时,我们想到了这一点。 我使用ThreadLocal另外我使用Spring,我知道在几个地方它也使用它。 由于NIO连接器每个连接没有一个线程,我担心如果ThreadLocal对象在清理之前与另一个线程共享,则可能导致很难找到错误。 但是,我认为这不是一个问题,因为它不是我能找到的文件警告,也没有发现任何其他post警告这一点。 我假设NIO连接器对服务于实际请求的线程没有影响。 在我采用这个假设之前,我希望找到一些具体的证据。

在实例变量中使用ThreadLocal

如果Java ThreadLocal变量用作实例变量 (例如,在生成线程局部对象的方法中), 那么它们是否会生成线程局部值 ,或者它们是否必须始终是静态的? 作为一个例子,假设一个典型的场景,其中几个非常昂贵的初始化非线程安全的类的对象需要在单个静态初始化块中实例化,存储在单个类的静态变量中(例如,在Map数据结构)从那时起用于许多不同线程的密集处理。 为了实现线程安全,显然必须传递每个静态对象的不同副本。 例如,需要跨不同线程安全使用的Java DateFormat对象。 在Web上可以找到的许多示例中,方法似乎是分别声明每个ThreadLocal变量,在initialValue()方法中实例化新对象,然后使用get()方法来检索线程本地实例。 如果要创建数十个或数百个这样的对象,每个都有自己的初始化参数,这种方法效率不高。 例如,许多SimpleDateFormat对象各有不同的日期模式。 如果对象的实例化可以在循环中完成,该循环在每次迭代中产生不同的值,则在通过适当地初始化相应对象来创建每个值之后,将需要用于产生线程局部实例的通用方法。 基于以上所述,以下通用静态方法不起作用,因为每次调用initialValue()时都会产生相同的引用: // Each value is an object initialized prior to calling getLocal(…) public static final T getLocal(final T value) { ThreadLocal local = new ThreadLocal() { @Override protected T initialValue() { return value; } }; return local.get(); } 相反,需要一种在initialValue()中创建新对象的机制。 因此,唯一的通用方法可能是使用reflection,类似于 private static […]

企业应用程序中的ThreadLocal用法

如果我的Web应用程序和ejb应用程序在同一台机器上(在同一个JVM上)并且所有ejb调用都是本地调用,那么在将信息从Web传递到ejb时, ThreadLocal的使用是否会产生任何问题? 如果ejb调用是远程的,任何解决方法? ThreadLocal信息是否可以从Web应用程序到ejb应用程序? 在这种情况下是否建议使用ThreadLocal ?

如何识别和删除从Java中的webapp启动的Threads / ThreadLocals?

每当我停止或重新部署webapp时,我都会看到很多类似的错误, msg=The web application [] created a ThreadLocal with key of type [] (value []) and a value of type [] (value []) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid probable memory leak 我不是在我的应用程序中创建任何ThreadLocals,而是引用可能正在创建这些ThreadLocals的许多库。 我们目前正在使用Tomcat 7.我已经遇到过其他类似的问题[在Tomcat中重新部署应用程序时内存泄漏或catalina.out中的这些警告是什么?]但是所有这些只是暗示这是Tomcatfunction来警告你ThreadLocals没有被删除。 我没有看到删除ThreadLocals的任何答案。 我也看到一些关于线程没有停止的错误, msg=The […]