gpt4 book ai didi

java - 当我的共享变量可以随时更改时,如何使我的代码线程安全?

转载 作者:行者123 更新时间:2023-12-01 07:44:02 24 4
gpt4 key购买 nike

这是一个被问过很多次的问题,我仔细检查了以前提出的许多问题,但没有一个给我答案,所以我想我会把它放在这里。

问题是让我的代码在java中线程安全,知道只有一个共享变量,但它可以随时更改,实际上我有一种感觉,我正在优化的代码没有考虑到多线程环境,所以我可能得考虑一下......

基本上,我有一个类可以在 5 个线程之间共享。该类有一个私有(private)属性“myProperty”,它可以采用 5 个不同的值(每个线程一个)。问题是,一旦它被构造函数实例化,该值在线程的剩余生命周期中就不应再更改。

我非常清楚用于将大部分代码片段变成“头部安全”的一些技术,包括锁、“同步”关键字、 volatile 变量和原子类型,但我感觉这些技术无济于事当前情况,因为它们不会阻止变量被修改。

这是代码:

// The thread that calls for the class containing the shared variable //

public class myThread implements Runnable {

@Autowired
private Shared myProperty;

//some code
}

// The class containing the shared variable //

public class Shared {

private String operator;
private Lock lock = new ReentrantLock();

public void inititiate(){
this.lock.lock()
try{
this.operator.initiate() // Gets a different value depending on the calling thread
} finally {
this.lock.unlock();
}
}

// some code
}

事实上,上面的代码只是保证两个线程不会同时改变变量,但后者仍然会改变。一个“天真的”解决方法包括创建一个表(operatorList)(或列表、映射等),将运算符与其调用线程的 ID 相关联,这样每个线程只需使用其 id 访问其运算符在表中,但这样做会让我们更改访问共享变量的所有线程类,而且有很多。知道如何以独占方式为每个调用线程存储不同的运算符字符串值,并进行最小的更改(不使用魔法)吗?

最佳答案

我不能 100% 确定我正确理解了你的问题,但无论如何我都会尝试一下。如果我错了请纠正我。

A "naive" workaround would consist in creating a table (operatorList) for instance (or a list, a map, etc. ) associating an operator with its calling thread's ID, this way each thread would just have to access its operator using its id in the table but doing this would make us change all the thread classes which access the shared variable and there are many.

Java 中已经有类似的东西 - ThreadLocal类?

您可以创建任何对象的线程本地副本:

 private static final ThreadLocal<MyObject> operator =
new ThreadLocal<MyObject>() {
@Override
protected MyObject initialValue() {
// return thread-local copy of the "MyObject"
}
};

在代码的后面,当特定线程需要获取自己的本地副本时,它所需要做的就是:operator.get()。实际上,ThreadLocal 的实现与您所描述的类似 - 每个线程的 ThreadLocal 值的映射。只有Map不是静态的,并且实际上绑定(bind)到特定的线程。这样,当线程终止时,它会带走它的 ThreadLocal 变量。

关于java - 当我的共享变量可以随时更改时,如何使我的代码线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58376052/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com