2016-02-29 40 views
-2

我有一个类,例如:如何使用AtomicInteger?

public class A{ 
    private final int number; 

    public A(int number){ 
     this.number = number; 
    } 
} 

Quesiton是,我想更新number时间的时候,我必须做一个对象无状态,这意味着nubmer必须是最后的。我的朋友建议我使用AtomicInteger班,但我不知道如何使其工作。

+0

'final'将使属性不可变。无状态依赖于上下文,也就是你用'number'做什么 - 你可以用一个'A'来执行一个opterion,它不会在操作之前使A处于一个可区分的状态,所以它将是无状态的从某种意义上说 - 但这又取决于你需要定义的意义。 –

+2

嗯..如果它包含一个可变状态,A怎么可能是无状态的? – ZhongYu

+0

“我想每次更新数字时间,并且我必须让一个对象成为无状态的”< - 您不能同时拥有这两个对象。这感觉像是[X-Y问题](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem);你最近想做什么?你正在解决的背景和问题是什么? –

回答

0

的AtomicInteger是线程安全的,你应该使用这样的:

public class Atomic{ 
    private AtomicInteger number; 

    public Atomic(int number){ 
     this.number = new AtomicInteger(number); 
    } 

    public int getNumber() { 
    return number.get(); 
    } 

    public void setNumber(int number) { 
    this.number.set(number);; 
    } 

} 

但是,如果你想使最终的东西你不应该使用的AtomicInteger,并最终必须在编译时已知,以便您的解决方案封装,像你这样做:

public final class Atomic{ 
    private int number; 

    public Atomic(int number){ 
     this.number = number; 
    } 

    public int getNumber() { 
    return this.number; 
    } 
} 

对于无国籍的对象,我认为你误解了它的含义。

+0

帅哥,感谢您的回复,建议使用'final AtomicInteger i',引用永远不会改变,但是对象中的值可能会改变。但我不知道这有什么好处。 –

+0

你究竟想在这里做什么? –

1

拥有一个AtomicInteger不会使该类无状态。更新整数,无论​​是否为原子,都会改变实例的内部状态。

您可以使该类不可变,即状态不能更改,并为每个状态更改创建一个新实例。例如:

public class A { 
    private final int number; 
    public A(int n) { 
     number = n; 
    } 
    public int getNumber() { 
     return number; 
    } 
    public A setNumber(int n) { 
     return new A(n); 
    } 
} 
+0

家伙,感谢您的回复,建议使用最终的AtomicInteger我,引用永远不会改变,但对象中的值可能会改变。但我不知道这有什么好处。 –