当共享变量可以随时更改时,如何使代码具有线程安全性?

问题描述 投票:0回答:2

这是一个已被问过很多次的问题,我已经仔细检查了以前提出的许多问题,但是没有一个给我答案元素,所以我决定自己提出一个问题。

问题是,使我的代码在Java中成为线程安全的,因为知道只有一个共享变量,但是它可以随时更改,实际上,我感觉到我正在优化的代码并未考虑用于多线程环境,所以我可能不得不考虑一下...

[基本上,我有一个可以在5个线程之间共享的类。此类具有私有属性“ myProperty”,该属性可以采用5个不同的值(每个线程一个)。问题在于,一旦构造函数实例化了该值,则该值在线程余下的生命中将不再更改。

我很清楚一些用于将大部分代码“转头安全”的技术,包括锁,“ synchronized”关键字,易失性变量和原子类型,但是我觉得这些技术对当前情况,因为它们不会阻止修改变量。

这里是代码:

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

public class myThread implements Runnable {

     @Autowired
     private Shared repo;

     //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即可访问其运算符在表中,但是这样做会使我们更改所有访问共享变量的线程类,并且有很多。关于如何以最小的更改(不使用magic)如何以独占方式为每个调用线程存储不同的运算符字符串值的任何想法吗?

java multithreading thread-local
2个回答
3
投票

我不确定我是否完全了解这种情况,但是如果您要确保每个线程都使用一个线程特定的实例作为变量,解决方案是使用类型为ThreadLocal<T>的变量。]​​>


3
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.