因此,当涉及到代码的线程安全性时,我总体上非常好,但是我目前遇到了一种情况,米不清楚处理它的最佳方式。Java线程安全:当你需要调用一个实例变量时,如何处理一个实例变量
我有一个实例变量,非final,因为封闭类可以更改它的值。这个变量是一个对象,有几个方法在应用程序中被调用。这里有一个快速示例来展示我的意思。
private class Foo{
private FooFoo fooFoo;
public synchronized void setFooFoo(FooFoo fooFoo){
this.fooFoo = fooFoo;
}
public void doSomething(){
fooFoo.doSomething(); //How do I make this line thread-safe?
}
}
更改fooFoo字段的引用很容易,只是简单的同步。但是什么时候在fooFoo上调用doSomething()方法呢?由于死锁风险,我总是犹豫是否采用外来方法。
在实际情况中,这是基于此,有许多不同的变化。我的公司的应用程序是一个庞大的代码库,通常类似于一碗意大利面,所以当编写任何类型的同步代码时,我会变得更加偏执狂,因为这种紧密的耦合以及开发人员不仅在这里美国,但在东欧的离岸公司工作,我不相信他们都会做出好的编码决定。
所以我只是在多线程环境中寻找处理这种情况的最佳实践。谢谢。
你为什么认为这是'死锁风险'? –
为什么你认为doSomething()方法的简单同步当setFooFoo()足够时不起作用?如果你在两个方法上都放了synchronized关键字,那么这个锁就会在同一个对象上,因此不会有死锁的机会。 – Vijay
给定三个线程,如果线程'A'和线程'B'都同时调用'setFooFoo',并且如果线程'C'调用'fooFoo.doSomething()'你想要发生什么,你会想要发生什么?那时候。即使没有同步化,这种情况也不会导致崩溃。 – OldCurmudgeon