有個需求,根據日期來生成乙個自增長編號,格式: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...