java如何生成唯一码_java – 如何为方法实例生成唯一的哈希码?
一個(gè)簡(jiǎn)單的(未經(jīng)測(cè)試,使用風(fēng)險(xiǎn)自負(fù))可能有效的解決方案是為每個(gè)線(xiàn)程維護(hù)每個(gè)方法的計(jì)數(shù)器:
private static final ConcurrentHashMap>
COUNTERS = new ConcurrentHashMap<>();
public static int getInvocationId(String methodName, long threadId) {
return counter(methodName, threadId).getAndIncrement();
}
private static AtomicInteger counter(String methodName, long threadId) {
ConcurrentHashMap map = countersForMethodName(methodName);
AtomicInteger counter = map.get(threadId);
if (counter == null) {
AtomicInteger newCounter = new AtomicInteger();
counter = map.putIfAbsent(threadId, newCounter);
if (counter == null) {
return newCounter;
}
}
return counter;
}
private static ConcurrentHashMap countersForMethodName(
String methodName) {
ConcurrentHashMap map = COUNTERS.get(methodName);
if (map == null) {
ConcurrentHashMap newMap = new ConcurrentHashMap<>();
map = COUNTERS.putIfAbsent(methodName, newMap);
if (map == null) {
return newMap;
}
}
return map;
}
然后,在你的建議中,例如:
int invocationId = getInvocationId(thisJoinPoint.getSignature().getName(),
Thread.currentThread().getId());
// do what you want with invocationId
請(qǐng)注意,這依賴(lài)于在與目標(biāo)方法相同的線(xiàn)程中執(zhí)行的建議 – 遺憾的是,我對(duì)AspectJ不太熟悉,不知道這個(gè)假設(shè)是否總是成立.
CAVEAT:如果您的環(huán)境始終創(chuàng)建并過(guò)期新線(xiàn)程,那么上面的樹(shù)將繼續(xù)增長(zhǎng)(實(shí)質(zhì)上是內(nèi)存泄漏).如果這是一個(gè)問(wèn)題,那么你需要輸入一些其他代碼來(lái)定期枚舉所有活動(dòng)線(xiàn)程,并從樹(shù)中刪除過(guò)期的條目.在這種情況下,您可能希望使用映射每線(xiàn)程ID,然后使用每個(gè)方法名稱(chēng)來(lái)提高修剪效率.
總結(jié)
以上是生活随笔為你收集整理的java如何生成唯一码_java – 如何为方法实例生成唯一的哈希码?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 上海欢乐谷老年人门票多少
- 下一篇: mysql 选项_mysql常用选项