我知道您可以通过编写对final
或volatile
字段的引用来安全地发布非线程安全对象,该字段稍后将由另一个线程读取,前提是发布时线程创建该对象的对象会放弃对其的引用,以便它不再干扰或不安全地观察该对象在另一个线程中的使用。本地最终引用的安全发布
但是在这个例子中,没有明确的final
字段,只有final
局部变量。 如果来电者丢弃了对unsafe
的引用,这是否安全发布?
void publish(final Unsafe unsafe) {
mExecutor.execute(new Runnable() {
public void run() {
// do something with unsafe
}
}
}
我发现了几个Q &作为,像this one,这表明final
局部变量是隐式“复制”到匿名类。这是否意味着上面的例子等同于这个?
void publish(final Unsafe unsafe) {
mExecutor.execute(new Runnable() {
final Unsafe mUnsafe = unsafe;
public void run() {
// do something with mUnsafe
}
}
}
编辑澄清:
Unsafe
可以是任何东西,但说这是这样的:
public class Unsafe {
public int x;
}
而且mExecutor
是什么,满足Executor
合同。
您的执行程序正在使用线程安全队列。要看到这个问题,你必须在线程之间传递对象,而不用在任何地方使用合适的内存屏障 –
@PeterLawrey class Executor {void execute(Runnable r){}}' - 这里没有队列。但问题是*可能*有效还是... – Marco13
BTW'Unsafe'是具有一个单类,虽然你可以创建更多的人... –