Tag: thread local

ThreadLocal – 使用spring-boot作为REST API的上下文信息

我有一些spring-boot应用程序(它暴露了rest api)。 提到的REST API由spring-security 。 一切都很好,但是现在我需要为服务请求设置上下文。 设置上下文是关于根据用户上下文选择数据源。 关键是RoutingDataSource需要使用这个上下文。 (由于其他原因,必须在validation请求后直接设置此上下文,我还有其他使用RoutingDataSource的线程,但没有请求调用(没有用户上下文))。 我可以做的这些事情,但我的疑虑是关注上下文的线程安全性和清除它。 我试图在文档中找到答案,但我没有成功。 public class CustomContextHolder { private static final ThreadLocal contextHolder = new ThreadLocal(); public static void setContext(DatabaseType databaseType) { contextHolder.set(databaseType); } public static CustomerType getContext() { return (CustomerType) contextHolder.get(); } public static void clearContext() { contextHolder.remove(); } } 并设置上下文: @Component class AuthorizedRequestFilter extends OncePerRequestFilter { […]

扩展java的ThreadLocal以允许在所有线程中重置值

看了这个问题之后 ,我想我想要包装ThreadLocal来添加重置行为。 我想要一个类似于ThreadLocal的东西,我可以从任何线程调用一个方法将所有值设置回相同的值。 到目前为止我有这个: public class ThreadLocalFlag { private ThreadLocal flag; private List allValues = new ArrayList(); public ThreadLocalFlag() { flag = new ThreadLocal() { @Override protected Boolean initialValue() { Boolean value = false; allValues.add(value); return value; } }; } public boolean get() { return flag.get(); } public void set(Boolean value) { flag.set(value); } public […]

SLF4J是否是线程安全的?

我可能有一个Dog类,它有一个跨多个线程共享的实例。 我计划将SLF4J用于所有日志记录: public class Dog { private Logger logger = LoggerFactory.getLogger(Dog.class); // …etc. } 我的logger实例线程是否安全? 为什么/为什么不呢?

Java线程安全数据库连接

我正在编写一个servlet,通过访问和修改数据库中的某些表来处理每个请求。 我希望与数据库的连接是线程安全的。 我不想使用现有的库/框架(spring,hibernate等)。 我知道我可以通过以下方式使用java的ThreadLocal: public class DatabaseRegistry { //assume it’s a singleton private Properties prop = new Properties(); public static final ThreadLocal threadConnection = new ThreadLocal(); private Connection connect() throws SQLException { try { // This will load the MySQL driver, each DB has its own driver Class.forName(“com.mysql.jdbc.Driver”); // Setup the connection with the DB […]

为什么有些网络服务器会抱怨他们创建的内存泄漏?

标题可能有点强,但让我解释一下我如何理解会发生什么。 我猜这发生在Tomcat上(引用的消息来自Tomcat),但我不确定了。 TL; DR在底部有一个总结,为什么我声称它是Web服务器的错。 我可能错了(但没有错误的可能性,没有理由问): 应用程序使用库 该库使用ThreadLocal ThreadLocal引用库中的对象 每个对象引用其ClassLoader 网络服务器 汇集其工作线程以提高效率 为应用程序提供任意线程 当应用程序停止或重新部署时,没有什么特别的(在线程池中) 如果我理解正确,在重新部署后,旧的“脏”线程继续被重用。 他们的ThreadLocal引用引用其ClassLoader的旧类,它引用整个旧类层次结构。 所以很多东西都停留在PermGen空间中,随着时间的推移会导致OutOfMemoryError 。 到目前为止这是对的吗? 我假设有两件事: 重新部署频率是每小时几次 线程创建开销只是毫秒的一小部分 因此,每次重新部署时完整的线程池更新每小时花费几分之一毫秒,即,时间开销为0.0001 * 12/3600 * 100%即0.000033% 。 但是,不是接受这个微小的开销,而是有无数的问题 。 我的计算错了还是我忽略了什么? 作为警告,我们得到了消息 Web应用程序…使用类型为…的键创建了一个ThreadLocal,并且值为…但在Web应用程序停止时无法将其删除。 应该更好地说明 Web服务器…使用线程池但在停止(或重新部署)应用程序后无法续订。 或者我错了? 即使所有线程不时重新创建,时间开销也可以忽略不计。 但是在将ThreadLocal提供给应用程序之前清除它们就足够了,甚至更快。 概要 有一些真正的问题(最近这个 ),用户无能为力。 图书馆作家有时可以而且有时不可以。 恕我直言,网络服务器可以很容易地解决它。 事情发生了并且有原因。 所以我责怪唯一一个可以对此采取任何行动的政党。 关于Web服务器应该做什么的建议 这个问题的标题比正确的更具挑衅性,但它有其重要意义。 raphw的答案也是如此。 这个相关问题有另一个公开的赏金。 我认为Web服务器可以解决它如下: 确保每个线程在某个时候被重用(或杀死) 在ThreadLocal存储LastCleanupTimestamp (对于新线程,它是创建时间) 当重新使用线程时,检查清理时间戳是否低于某个阈值(例如,现在减去一些delta ,例如1小时) 如果是这样,请清除所有ThreadLocal并设置一个新的LastCleanupTimestamp […]

ThreadLocal资源泄漏和WeakReference

我对ThreadLocal的有限理解是它存在资源泄漏问题 。 我收集这个问题可以通过在ThreadLocal中正确使用WeakReferences来解决(尽管我可能误解了这一点。)我只是想要一个模式或示例来正确使用带有WeakReference的ThreadLocal(如果存在)。 例如,在此代码片段中,WeakReference将在何处引入? static class DateTimeFormatter { private static final ThreadLocal DATE_PARSER_THREAD_LOCAL = new ThreadLocal() { protected SimpleDateFormat initialValue() { return new SimpleDateFormat(“yyyy/MM/dd HH:mmz”); } }; public String format(final Date date) { return DATE_PARSER_THREAD_LOCAL.get().format(date); } public Date parse(final String date) throws ParseException { return DATE_PARSER_THREAD_LOCAL.get().parse(date); } }

如何提高ThreadLocal包装的SimpleDateFormat的性能?

这是在RHEL上的Java 7(51)上有24个内核我们注意到,当我们增加线程池大小时,包含在本地线程中的java SimpleDateFormat的平均响应时间会增加。 这是预期的吗? 或者,我只是在做一些愚蠢的事情? 测试程序 public class DateFormatterLoadTest { private static final Logger LOG = Logger.getLogger(DateFormatterLoadTest .class); private final static int CONCURRENCY = 10; public static void main(String[] args) throws Exception { final AtomicLong total = new AtomicLong(0); ExecutorService es = Executors.newFixedThreadPool(CONCURRENCY); final CountDownLatch cdl = new CountDownLatch(CONCURRENCY); for (int i = 0; i […]

实例级线程局部存储有哪些优点?

这个问题让我想到了Java和.NET等高级开发框架中的线程局部存储 。 Java有一个ThreadLocal类(可能还有其他构造),而.NET有数据槽 ,很快就有自己的ThreadLocal类。 (它还有ThreadStaticAttribute ,但我对成员数据的线程局部存储特别感兴趣。)大多数其他现代开发环境为语言或框架级别提供了一种或多种机制。 线程局部存储解决了什么问题,或者线程局部存储提供了什么优势,而不是创建单独的对象实例以包含线程本地数据的标准面向对象的习惯用法? 换句话说,这是怎么回事: // Thread local storage approach – start 200 threads using the same object // Each thread creates a copy of any thread-local data ThreadLocalInstance instance = new ThreadLocalInstance(); for(int i=0; i < 200; i++) { ThreadStart threadStart = new ThreadStart(instance.DoSomething); new Thread(threadStart).Start(); } 优于此? // Normal oo […]

Java ThreadLocal静态?

在线程本地中设置值: //Class A holds the static ThreadLocal variable. Class A{ public static ThreadLocal myThreadLocal = new ThreadLocal(); …. } //A Class B method sets value in A’s static ThreadLocal variable class B{ { public void someBmethod(){ X x = new X(); A.myThreadLocal.set(x); } } //Class C retrieves the value set in A’s Thread Local variable. […]

java threadlocal singleton – 它是什么?

外行人说,当有人说某个对象是Java中的线程单例时,它意味着什么? 我正在参加关于Java Server Faces的讲座,每次谈到FacesContext时 – 讲师总是提醒我们它是一个线程本地单例。