繁体   English   中英

具有非最终成员且没有mutator方法的类的线程安全

[英]Thread safety for classes with non-final members with no mutator methods

对于以下课程,使mNumSides最终化意味着什么? “线程安全性”受到影响吗?

class Shape {
    private int mNumSides;

    public Shape(int numSides) {
        mNumSides = numSides;
    }

    public int getNumSides() {
        return mNumSides;
    }
}

绝对。 final关键字可确保所有线程始终都能看到相同的mNumSides值。 有关final及其对内存模型的影响的更多信息,请参见此处

如果不使用final该对象可能会不一致地发布到其他线程,并且线程有可能(虽然非常低)将mNumSides的值视为0而不是构造函数中传递的numSides 不过,使其volatilestatic也将起作用。

如果声明为final ,则不能重新分配Num边。 由于没有被声明为volatile ,因此没有多个线程读取不同值的风险。

因此,将变量声明为final可使类线程安全。 截至目前,它不是线程安全的。

声明对象final可以避免重新分配其引用,但是,如果对象具有内部数据,则可以重新分配该数据,这不是线程安全的。 这是Colin在另一个答案上提出的重要观点。

在这种情况下,数据是原始数据,因此没有内部数据。 所以在这里,将其声明为final可以正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM