架構師寫的BUG,非比尋常!

Java技術棧
www.javastack.cn
關注閱讀更多優(yōu)質文章

Netflix公司的影響。ConcurrentHashMap,然后每次通過監(jiān)控key取出相應的數(shù)據(jù),然后在value上遞增。這么簡單的代碼,確實不需要增加什么注釋。
jmap,最主要的是權限大,于是自己搞了一份拷貝到線下分析。這個工作不會用的可以關注公眾號Java技術棧搜索閱讀。MonitorKey和MonitorValue。Monitor$MonitorKey@15aeb7ab
?后面的給截斷了。key = key.split("\\?")[0];
MonitorKey重寫equals和hashCode方法了。visit代碼出現(xiàn)問題了。雖然問題不是很大,但它畢竟是個問題。
線程1:獲取key為a的值
線程2:獲取key為a的值
線程1:a為null,生成一個b
線程2:a為null,生成一個c
線程1:保存a=b
線程2:保存a=c
synchronized不就成了。public synchronized void visit(String url, String desc, long timeCost)
putIfAbsent方法,代碼改動如下:MonitorKey key = new MonitorKey(url, desc);
MonitorValue value = monitors.putIfAbsent(key, new MonitorValue());
value.count.getAndIncrement();
value.totalTime.getAndAdd(timeCost);
value.avgTime = value.totalTime.get() / value.count.get();
synchronized就能夠很容易簡單解決的問題,為啥不直接用呢?下面這種代碼改動太大,有風險。最近熱文:
1、重磅!《Java開發(fā)手冊(嵩山版)》最新發(fā)布
4、Spring Boot 太狠了,一次發(fā)布 3 個版本!
6、盤點 6 個被淘汰的 Java 技術,曾經(jīng)風光過!
7、Spring Boot Redis 實現(xiàn)分布式鎖,真香!
8、Spring Boot 干掉了 Maven 擁抱 Gradle!
掃碼關注Java技術棧公眾號閱讀更多干貨。
評論
圖片
表情
