Java同步线程
作者:互联网
不确定此D类线程是否正确.是否存在竞争条件,访问时是否应该处于同步块中?如果D是一个外部类,并且A实例已传递给D构造函数,该怎么办?
class A
{
int i;
void f() {
i++;
D d = new D();
d.start();
}
class D extends Thread {
public void run() {
int g = i;
}
}
}
解决方法:
只要您仅调用一次f,这是安全的.变异数据的线程A与从线程A启动的线程B之间存在先发生后关系(HB关系位于Thread.start).由于没有人会在D启动后更改数据,因此这是安全的.
破坏线程安全性的一些方法:
>再次变异我,包括再次调用foo
>从除D之外的其他线程或调用foo的线程中读取i
即使在调用foo的线程中也无法再次对i进行变异,原因是该变异将在d.start()之后发生,因此没有针对第二个变异的HB优势.
您无法从任何任意线程读取i的原因是该线程不会对i突变有明确定义的视图.
它可能比这更微妙,但是从高层次上讲,您就可以开始了.
标签:multithreading,java-util-concurrent,java 来源: https://codeday.me/bug/20191123/2066792.html