编程语言
首页 > 编程语言> > Java同步线程

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