使用AtomicInteger實現自增長編號

2021-09-26 20:46:00 字數 2320 閱讀 5890

有個需求,根據日期來生成乙個自增長編號,格式:2019090400001。

思路是使用atomicinteger原子操作類,好處就是不會出現重複,在多執行緒操作環境下優勢尤為明顯,可以自行研究一下。

下面是實現**

public

class

textutil

/** * 生成案件編號,格式:2019082300001

* @return

*/public

static string getcaseno()

int nextnum = id.

get(

"num").

getandincrement()

; string str = string.

format

("%05d"

, nextnum)

; now += str;

return now;

}public

static

void

main

(string[

] args)

catch

(interruptedexception e)}}

}

測試結果

初步實現了功能,但是當專案重啟後編號會重新開始計算。

這裡考慮使用快取機制把值存起來,專案重啟時再次獲取並賦值。

下面乙個版本修改上述風險,使用檔案儲存,缺點就是增加了磁碟io。

當然你可以使用更為高效的redis或者其它技術。

public

class

textutil

id.put(

"num"

,new

atomicinteger

(num));

}/**

* 生成編號,格式:2019082300001

** @return

*/public

static string getcaseno()

int nextnum = id.

get(

"num").

getandincrement()

;store

(nextnum +"")

; string str = string.

format

("%05d"

, nextnum)

; now += str;

store

(now)

;return now;

}//存資料

private

static

void

store

(string eventid)

catch

(exception e)

finally

catch

(exception e)}}

}//讀資料

private

static string read()

in =

newbufferedinputstream

(new

fileinputstream

(f))

;//讀取資料

//一次性取多少位元組

byte

bytes =

newbyte[32

];//接受讀取的內容(n就代表的相關資料,只不過是數字的形式)

int n =-1

;//迴圈取出資料

while

((n = in.

read

(bytes,

0, bytes.length))!=

-1)}

catch

(exception e)

finally

catch

(ioexception e)}}

return str;

}public

static

void

main

(string[

] args)

catch

(interruptedexception e)}}

}

再次測試的時候就有連續性了

AtomicInteger原始碼分析

最常需要解決的問題是i 這個語義在多執行緒中是不安全的。雖然從語法上看上去是乙個操作,實際上分為了三步。取出i的值,i 1,將i 1的計算結果賦值給i。假設i的初始值為5,一種不安全的情況如下 1 2345 6執行緒1 i 5 i 1 6 i 6 執行緒2i 5 i 1 6 i 6 也就是說兩個執行...

AtomicInteger原始碼解析

1.為什麼要使用atomicinteger 使用atomicinteger的原因來自於多執行緒併發情況下帶來的原子性問題 注 所謂原子操作是指不會被 執行緒排程 機制打斷的操作 這種操作一旦開始,就一直執行到結束,中間不會有任何 context switch 切 換到另乙個執行緒 舉乙個例子,比如說...

AtomicInteger原始碼解析

atomicinteger,由於儲存的值的value是volatile型別所有具有執行緒可見性。通過cas比較交換進行自增,或者更新值具有原子性。所以atomicinteger是執行緒安全的具有類鎖一樣的執行緒安全性。具體參見下面原始碼解析 private static final unsafe u...