2016-02-02 177 views
0

我已經問過如何生成自動增量ID Generate auto increment number by using Java在java中生成自動增量ID

我在下面的代碼中使用:

private static final AtomicInteger count = new AtomicInteger(0); 
uniqueID = count.incrementAndGet(); 

上面的代碼工作正常,但問題是count靜態變量。對於這種靜態,它永遠不會再開始到0,它總是從最後一個增量ID開始。這是問題。

AtomicInteger之外是否有其他方法?

另一個問題是,我正在使用GWT,所以AtomicInteger在GWT中不可用。

所以我必須找到另一種方式來做到這一點。

+2

'它從來沒有開始再次0,它總是以最後一個增量id'開始 - 是不是自動增量的主題?或者你問你如何在'0'處重新啓動? –

+1

我在問如何將它重新設置爲0。 –

+2

你試過'count.set(0)'嗎? https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html#set-int- –

回答

0
private static AtomicInteger count = new AtomicInteger(0);  
count.set(0);  
uniqueID = count.incrementAndGet(); 
+0

我不知道你是否看到了OP的編輯:*「除AtomicInteger之外是否還有其他方法?」*此外,代碼只回答沒有任何解釋通常會被忽視。 –

1

AtomicInteger是「有符號」整數。它將增加至Integer.MAX_VALUE;那麼,由於整數溢出,你期望得到Integer.MIN_VALUE

不幸的是,AtomicInteger中的大部分線程安全方法都是final的,包括incrementAndGet(),因此您無法重寫它們。

但是你可以創建一個自定義類來包裝一個AtomicInteger,並且你可以根據你的需要創建​​方法。例如:

public class PositiveAtomicInteger { 

    private AtomicInteger value; 

    //plz add additional checks if you always want to start from value>=0 
    public PositiveAtomicInteger(int value) { 
     this.value = new AtomicInteger(value); 
    } 

    public synchronized int incrementAndGet() { 
     int result = value.incrementAndGet(); 
     //in case of integer overflow 
     if (result < 0) { 
      value.set(0); 
      return 0; 
     } 
     return result; 
    } 
}