mNumSides
对于下面的课程,make final的含义是什么?“线程安全”是否受到影响?
class Shape {
private int mNumSides;
public Shape(int numSides) {
mNumSides = numSides;
}
public int getNumSides() {
return mNumSides;
}
}
mNumSides
对于下面的课程,make final的含义是什么?“线程安全”是否受到影响?
class Shape {
private int mNumSides;
public Shape(int numSides) {
mNumSides = numSides;
}
public int getNumSides() {
return mNumSides;
}
}
绝对地。final
关键字保证所有线程始终看到相同的值mNumSides
。final
有关内存模型及其对此处的影响的更多信息。
不使用final
该对象可能会不一致地发布到其他线程,并且线程可能会看到mNumSides
as的值0
而不是numSides
构造函数中传递的值(尽管非常低)。制作它volatile
或static
也将起作用。
如果声明为final,则不能重新分配 Num 边。由于未将其声明为volatile ,因此不会有多个线程读取不同值的风险。
因此,将变量声明为final
使类线程安全。截至目前,它不是线程安全的。
声明一个对象 final 可以防止其引用被重新分配,但是如果对象具有内部数据,则可以重新分配该数据,这不是线程安全的。这是科林在另一个答案上提出的重要观点。
在这种情况下,数据是原始数据,因此没有内部数据。所以在这里,声明它最终工作正常。