java - 如何使这个线程安全

标签 java multithreading

我已经阅读了很多关于线程的文章,但我不确定处理这种情况的正确方法。假设我有一个引用对象的实用程序类。实用程序类确实在对象上工作,并且可以从多个线程调用

  class Utility{
     Foo xx;
     public Utility(Foo xx){
         this.xx = xx;
     }

    public void doWork(){
       x.action();
    }
  }

现在,如果我有两个线程将访问实用程序类并调用 doWork(),其中 xx 将始终引用同一个对象,我如何才能使其成为线程安全的?

编辑:实用程序类有 2 个实例(每个线程一个)但引用的 xx 对象相同。见编辑:

public class ThreadSafety {

    public static void main(String[] args) throws InterruptedException {
        Foo xx = new Foo();
        Utility util1 =  new Utility(xx); 
        Utility util2 =  new Utility(xx); 
        Thread t1 = new Thread(new MyRunnable(util1) , "t1");
        Thread t2 = new Thread(new MyRunnable(util2) , "t2");

        t1.start();
        t2.start();
        t1.join();
        t2.join();

    }

}

class MyRunnable implements Runnable{
    Utility util;

    @Override
    public void run() {
        util.doWork();
    }


    private void MyRunnable (Utility util) {
        this.util = util;
    }

}

最佳答案

public class Utility{
  private final Foo xx;

  public Utility(Foo xx){
    this.xx = xx;
  }

  public void doWork() {
    // ensures only one thread can be calling action
    synchronized(xx) {
      xx.action();
    }
  }
}

下面的一些变化:

  1. 使 xx finalprivate。将其设置为 private 可强制控制如何访问 xx
  2. 在调用 doWork 之前在 xx
  3. 同步。您可以将 synchronized 放在方法声明中,但我更愿意明确说明您锁定的对象。请注意,这不会“同步 xx”。它只是使用 xx 作为锁。在访问潜在危险代码块的任何地方,都必须使用具有相同监视器对象的同步块(synchronized block)。

关于java - 如何使这个线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28436239/

相关文章:

.net - TPL 取消延续从未调用已取消的任务

c++ - 为套接字轮询/选择设置超时值的最佳做法是什么?

Java Lucene : Search for terms that include non-alphanumeric characters

java - 在 hibernate 状态下禁用对多对一实体的更新

java - 使用 MethodHandle 查找最具体的重载方法

c++ - 保证唤醒所有线程并且每个线程只唤醒一次

java - 生产者消费者模式: on demand thread

c++ - 使用 boost::future::then 在主线程中执行

java - Spring 启动: Integration Test not excluding my Application configuration class

java - 如何让 for 循环在每次迭代中等待?