架構(gòu)師寫的BUG,非比尋常!

Java技術(shù)棧
www.javastack.cn
關(guān)注閱讀更多優(yōu)質(zhì)文章

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