标签: thread-local

内存问题和ThreadLocal <T>

我注意到这个ThreadLocal<T>实现IDisposable,暗示我在使用它时应该处理一个线程局部变量.我只是好奇具体的问题是什么,我应该小心做什么和/或避免做什么.

当线程退出时,线程的本地存储是否会被丢弃?如果我不处理我的ThreadLocal成员,最糟糕的情况是什么?

如果我有一个全局线程局部(oxymoron?hehe)变量(或者一个ThreadStatic变量)并且我在ThreadPool中的线程上赋值这个怎么办?我是否必须小心取消分配线程本地值,或者这不是一个问题?

.net c# multithreading thread-local

7
推荐指数
1
解决办法
2570
查看次数

Clojure中的Threadlocal计数器

我有一个Web应用程序,我希望能够跟踪请求(即线程)中调用给定函数的次数.

我知道可以使用ref以非线程本地方式进行,但是如何在本地进行线程化呢?

clojure thread-local

7
推荐指数
2
解决办法
2373
查看次数

Java Cached线程池和线程本地

我有一个关于java和并发的问题.

假设我有一个名为a的ThreadLocal变量.我使用CachedThreadPool来获取新线程.当一个线程被重新调用时,ThreadLocal变量会发生什么?它保持相同的值(因为它是一个相同的线程)或它开始为空(好像线程是新的)?

谢谢

java concurrency multithreading thread-local threadpool

7
推荐指数
2
解决办法
7840
查看次数

ThreadLocal Singleton

我在GlassFish上运行RESTful java后端.附加一个HTML5/JS前端,我可以将其放入webapp项目(然后将后端包含为依赖项),或者在不同位置的IIS Web服务器上运行.CORS不是问题.无论如何解决以下问题:

情况:

  1. User1登录,数据库路径设置为'db/user1 /'
  2. User1将"值1"插入数据库
  3. User2登录,数据库路径设置为'db/user2 /'
  4. User1尝试从数据库中删除"值1"

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的东西,但没有完全理解它,这可能是一个解决方案吗?

任何帮助肯定是值得赞赏的.

java singleton thread-local

7
推荐指数
1
解决办法
8090
查看次数

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本身是共享的,只允许一个线程进入块,而许多线程可以并行执行而不影响正确性.

这里需要同步吗?

java performance multithreading synchronized thread-local

7
推荐指数
1
解决办法
1477
查看次数

servlet中的threadlocal变量

threadlocals变量是否对拥有变量的servlet的所有请求都是全局的?

我在服务器上使用树脂.

感谢awnser.

我想我可以让自己更清楚.

具体案例:

我想要:

  • 请求开始执行时初始化静态变量.
  • 能够以线程安全的方式在从servlet调用的方法的进一步执行中查询变量的值,直到请求结束执行

java concurrency multithreading servlets thread-local

6
推荐指数
1
解决办法
1万
查看次数

ThreadLocal vs 参数传递 - 在接口设计中选择什么?

我已经阅读了有关 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)

哪种方法更好?为什么?

这些实现中的哪一个实现内存泄漏的可能性较小?

这些实现中的哪一个对 …

java interface thread-local

6
推荐指数
1
解决办法
2797
查看次数

访问静态初始化的__thread变量时出现分段错误

请考虑以下代码:

#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变量的静态初始化不起作用?可能会破坏操作系统?

c++ linux thread-local

6
推荐指数
1
解决办法
745
查看次数

thread_local成员变量构造

我在使用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)

Ideone

随着它取消注释,它变成了这样:

main
foo
foo
42
42
Run Code Online (Sandbox Code Playgroud)

Ideone

我只是在这里错过了一些愚蠢的东西吗?

$ gcc -v
Using built-in specs. …
Run Code Online (Sandbox Code Playgroud)

c++ construction thread-local c++11 gcc4.8

6
推荐指数
1
解决办法
4736
查看次数

Java 8 到 Java 17 ThreadLocal 问题

我的代码在 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)

java multithreading thread-local completable-future java-17

6
推荐指数
1
解决办法
956
查看次数