我一直在阅读很多关于线程的知识,但我不确定处理这种情况的正确方法。可以说我有一个引用对象的实用程序类。该实用程序类并在对象上工作,它可以从多个线程如何制作此线程安全
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;
}
}
请注意,如果doWork方法不会更改Foo实例的状态(特别是在Foo不可变的情况下),则不需要同步。 – sudocode 2015-02-10 16:11:27
+1 @JamesWatson给出了让你把'xx'私人化的唯一答案。没有必要提供同步方法来操作其他方法可以在没有同步的情况下访问的数据。 – 2015-02-10 16:52:12