我注意到这个ThreadLocal<T>实现IDisposable,暗示我在使用它时应该处理一个线程局部变量.我只是好奇具体的问题是什么,我应该小心做什么和/或避免做什么.
当线程退出时,线程的本地存储是否会被丢弃?如果我不处理我的ThreadLocal成员,最糟糕的情况是什么?
如果我有一个全局线程局部(oxymoron?hehe)变量(或者一个ThreadStatic变量)并且我在ThreadPool中的线程上赋值这个怎么办?我是否必须小心取消分配线程本地值,或者这不是一个问题?
我有一个Web应用程序,我希望能够跟踪请求(即线程)中调用给定函数的次数.
我知道可以使用ref以非线程本地方式进行,但是如何在本地进行线程化呢?
我有一个关于java和并发的问题.
假设我有一个名为a的ThreadLocal变量.我使用CachedThreadPool来获取新线程.当一个线程被重新调用时,ThreadLocal变量会发生什么?它保持相同的值(因为它是一个相同的线程)或它开始为空(好像线程是新的)?
谢谢
我在GlassFish上运行RESTful java后端.附加一个HTML5/JS前端,我可以将其放入webapp项目(然后将后端包含为依赖项),或者在不同位置的IIS Web服务器上运行.CORS不是问题.无论如何解决以下问题:
情况:
User1将无法从db/user1中删除值1,因为数据库路径已更改为db/user2且该数据库中没有值1.
public class DataAccess{
private static DataAccess dataaccess;
private String databasepath;
public static DataAccess getInstance() {
if (dataaccess == null) {
dataaccess = new DataAccess();
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何修改getInstance()方法以使其充当单例,但仅在该用户的线程内?我看到了一些名为threadlocal的东西,但没有完全理解它,这可能是一个解决方案吗?
任何帮助肯定是值得赞赏的.
这是我偶然发现的代码:
class TransactionContextHolder {
private static final ThreadLocal<TransactionContext> currentTransactionContext = new NamedInheritableThreadLocal<TransactionContext>(
"Test Transaction Context");
static TransactionContext getCurrentTransactionContext() {
return currentTransactionContext.get();
}
static void setCurrentTransactionContext(TransactionContext transactionContext) {
currentTransactionContext.set(transactionContext);
}
static TransactionContext removeCurrentTransactionContext() {
synchronized (currentTransactionContext) {
TransactionContext transactionContext = currentTransactionContext.get();
currentTransactionContext.remove();
return transactionContext;
}
}
Run Code Online (Sandbox Code Playgroud)
}
所述currentTransactionContext字段是类型的ThreadLocal的,它是在该类中唯一的字段.
在我看来,这里不需要同步,因为存储在ThreadLocal中的值与特定线程相关联,因此它不是共享状态.另外我认为它会影响性能,因为currentTransactionContext本身是共享的,只允许一个线程进入块,而许多线程可以并行执行而不影响正确性.
这里需要同步吗?
threadlocals变量是否对拥有变量的servlet的所有请求都是全局的?
我在服务器上使用树脂.
感谢awnser.
我想我可以让自己更清楚.
具体案例:
我想要:
我已经阅读了有关 ThreadLocal 及其使用的以下 SO 线程的有趣讨论。
这个问题更倾向于设计时选择。我的场景是这样的
如果我在 Web 应用程序中有一个值对象,几乎所有步骤都可能需要在同一个线程中使用它。我可以想到两个界面设计选项,如下所示
方法#1使用方法参数传递。
到目前为止,我一直专注于提出一个接口,该接口可以具有带有值对象接口参数的方法。
例如:
public interface SomeDataProcessorInterface {
public void processSomething(SomeValueObjectInterface vo);
}
public interface SomeValueObjectInterface extends Serializable {}
Run Code Online (Sandbox Code Playgroud)
方法 #2使用 ThreadLocal
在这种方法中,我可以有一个没有方法参数的接口,只需创建一个静态类来使用线程本地访问我的值对象。
例如:
public interface SomeDataProcessorInterface {
public void processSomething();
}
public interface SomeValueObjectInterface extends Serializable {}
public Class StaticClass {
private static ThreadLocal<SomeValueObjectInterface> threadLocalVO = new ThreadLocal<SomeValueObjectInterface>();
public static ThreadLocal getThreadLocal() {
return threadLocal;
}
Run Code Online (Sandbox Code Playgroud)
哪种方法更好?为什么?
这些实现中的哪一个实现内存泄漏的可能性较小?
这些实现中的哪一个对 …
请考虑以下代码:
#include <stdio.h>
__thread bool foo = true;
int
main() {
printf("foo = %d\n", foo);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译并运行:
$ g++ tls.cpp -o tls -o tls
$ ./tls
Run Code Online (Sandbox Code Playgroud)
在某些系统上 - 例如Amazon Linux 2013.09.0,ami-5b792c32,内核3.4.62-53.42.amzn1.i686,g ++ 4.6.3 20120306(Red Hat 4.6.3-2) - 这会导致分段错误一旦foo被访问.
另一方面,foo在代码中显式初始化不会导致分段错误:
#include <stdio.h>
__thread bool foo = true;
int
main() {
foo = true; /* Added!! */
printf("foo = %d\n", foo);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么第一个代码示例在某些系统上崩溃,而后者却没有?是否__thread变量的静态初始化不起作用?可能会破坏操作系统?
我在使用thread_local时遇到了一些奇怪的行为,并且不确定我是做错了什么还是GCC错误.我有以下最小的repro场景:
#include <iostream>
using namespace std;
struct bar {
struct foo {
foo () {
cerr << "foo" << endl;
}
int i = 42;
};
static thread_local foo FOO;
};
static thread_local bar::foo FREE_FOO;
thread_local bar::foo bar::FOO;
int main() {
bar b;
cerr << "main" << endl;
// cerr << FREE_FOO.i << endl;
cerr << b.FOO.i << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用上面的注释行,输出如下所示:
main
0
Run Code Online (Sandbox Code Playgroud)
随着它取消注释,它变成了这样:
main
foo
foo
42
42
Run Code Online (Sandbox Code Playgroud)
我只是在这里错过了一些愚蠢的东西吗?
$ gcc -v
Using built-in specs. …Run Code Online (Sandbox Code Playgroud) 我的代码在 Java 8 中运行良好,但是当我将其迁移到 Java 17 时,它就不起作用了。它涉及 ThreadLocal 和 CompletableFuture.runAsync。
以下是课程:
public class UriParameterHandler {
}
public class DateRangeEntity {
public String getCurrentDate(){
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
LocalDateTime now = LocalDateTime.now();
return dtf.format(now);
}
}
public class SessionHandler {
private static ThreadLocal<SessionHandler> instance = new InheritableThreadLocal<>();
private UriParameterHandler uriParameterHandler;
private DateRangeEntity dateRangeEntity;
private SessionHandler() {
instance.set(this);
}
public static void initialize() {
SessionHandler handler = new SessionHandler();
handler.uriParameterHandler = new UriParameterHandler();
}
public static UriParameterHandler getUriParameterHandler() {
return instance.get().uriParameterHandler; …Run Code Online (Sandbox Code Playgroud) thread-local ×10
java ×6
c++ ×2
concurrency ×2
.net ×1
c# ×1
c++11 ×1
clojure ×1
construction ×1
gcc4.8 ×1
interface ×1
java-17 ×1
linux ×1
performance ×1
servlets ×1
singleton ×1
synchronized ×1
threadpool ×1