0

mNumSides对于下面的课程,make final的含义是什么?“线程安全”是否受到影响?

class Shape {
    private int mNumSides;

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

    public int getNumSides() {
        return mNumSides;
    }
}
4

2 回答 2

3

绝对地。final关键字保证所有线程始终看到相同的值mNumSidesfinal有关内存模型及其对此处的影响的更多信息。

不使用final该对象可能会不一致地发布到其他线程,并且线程可能会看到mNumSidesas的值0而不是numSides构造函数中传递的值(尽管非常低)。制作它volatilestatic也将起作用。

于 2013-07-12T20:00:09.733 回答
0

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

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

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

在这种情况下,数据是原始数据,因此没有内部数据。所以在这里,声明它最终工作正常。

于 2013-07-12T19:59:26.503 回答