不可变性与线程安全性

时间:2016-09-26 05:51:42

标签: immutability

可以通过

声明来创建Java不可变类
  1. 宣布课程决赛。
  2. 声明所有成员字段最终。
  3. 没有制定者。
  4. 如果没有setter并且class被声明为final,为什么我们应该将成员设置为final?

    而且,我可以说,如果一个类是不可变的意味着它是线程安全的吗?

1 个答案:

答案 0 :(得分:1)

  

如果没有setter并且class被声明为final,为什么我们应该将成员设置为final?

避免内部修改内部。以下课程从外部看起来是不可变的,我们希望调用getBar()是免费的副作用(这意味着每当及时调用此方法时,我们希望相同结果,也称为确定性)。但事实并非如此,因为调用doThing()会对bar产生副作用。

public final class Foo {
    private int bar;

    public Foo(int bar) {
        this.bar = bar;
    }

    public int getBar() {
        return bar;
    }

    public void doThing() {
        //do some things

        //increment bar for some reason
        bar++;
    }
}

如果barfinal,则上述代码无法编译。

  

我可以说,如果一个类是Immutable意味着它是线程安全的吗?

没有必要,但在许多情况下是的。