欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

修改jvm-sandbox源碼導(dǎo)致線程安全分析

 更新時(shí)間:2023年06月02日 14:27:43   作者:雨翔河  
這篇文章主要為大家介紹了修改jvm-sandbox源碼導(dǎo)致線程安全分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

正文

今天收到運(yùn)維同事的消息,廣告組某應(yīng)用 cpu 從 5 月 29 號(hào)下午 16:30 開(kāi)始陡增不下,本著對(duì)問(wèn)題的好奇心幫忙排查了下這個(gè)問(wèn)題。

首先看了下 java 進(jìn)程的線程 cpu 使用情況,有四個(gè)處理線程每一個(gè)幾乎一直處于 40%-99% 的 cpu 使用,正常情況下不應(yīng)該出現(xiàn)這種情況,還好是多核機(jī)器,不然這容易直接搞崩潰機(jī)器。

堆棧信息

同事提供了幾分堆棧信息,在不同的時(shí)間段拿到的 jstack 信息占用高的 cpu 線程都指向了以下四個(gè)線程

"ForkJoinPool.commonPool-worker-1" #754509 daemon prio=5 os_prio=0 tid=0x00xxxxx36800 nid=0x1a9ec runnable [0x000xxxxx000]
   java.lang.Thread.State: RUNNABLE
	at java.util.HashMap$TreeNode.putTreeVal(HashMap.java:2002)
	at java.util.HashMap.putVal(HashMap.java:637)
	at java.util.HashMap.put(HashMap.java:611)
	at java.util.HashSet.add(HashSet.java:219)
	at com.alibaba.jvm.sandbox.core.enhance.weaver.EventProcessor.setcurrentThread(EventProcessor.java:147)
	at com.alibaba.jvm.sandbox.core.enhance.weaver.EventProcessor$Process.pushInvokeId(EventProcessor.java:45)
	at com.alibaba.jvm.sandbox.core.enhance.weaver.EventListenerHandler.handleOnBefore(EventListenerHandler.java:353)
	at java.com.alibaba.jvm.sandbox.spy.Spy.spyMethodOnBefore(Spy.java:164)
	at com.alibaba.dubbo.rpc.proxy.javassist.JavassistProxyFactory$1.doInvoke(JavassistProxyFactory.java)
	at com.alibaba.dubbo.rpc.proxy.AbstractProxyInvoker.invoke(AbstractProxyInvoker.java:72)
	at com.alibaba.dubbo.rpc.protocol.AbstractProxyProtocol$2.doInvoke(AbstractProxyProtocol.java:93)
	at com.alibaba.dubbo.rpc.protocol.AbstractInvoker.invoke(AbstractInvoker.java:144)
	at com.alibaba.dubbo.rpc.listener.ListenerInvokerWrapper.invoke(ListenerInvokerWrapper.java:74)
	at com.alibaba.extension.filter.AccessInvokeLogFilter.invoke(AccessInvokeLogFilter.java:29)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.csp.sentinel.adapter.dubbo.SentinelDubboConsumerFilter.invoke(SentinelDubboConsumerFilter.java:60)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:75)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.csp.sentinel.adapter.dubbo.DubboAppContextFilter.invoke(DubboAppContextFilter.java:41)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.protocol.dubbo.filter.FutureFilter.invoke(FutureFilter.java:53)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.filter.ConsumerContextFilter.invoke(ConsumerContextFilter.java:48)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.protocol.InvokerWrapper.invoke(InvokerWrapper.java:53)
	at com.alibaba.dubbo.rpc.cluster.support.FailoverClusterInvoker.doInvoke(FailoverClusterInvoker.java:77)
	at com.alibaba.dubbo.rpc.cluster.support.AbstractClusterInvoker.invoke(AbstractClusterInvoker.java:227)
	at com.alibaba.dubbo.rpc.cluster.support.wrapper.MockClusterInvoker.invoke(MockClusterInvoker.java:72)
	at com.alibaba.dubbo.rpc.proxy.InvokerInvocationHandler.invoke(InvokerInvocationHandler.java:52)
"DubboServerHandler-xxxx3:xxxx-thread-781" #1937 daemon prio=5 os_prio=0 tid=0x000xxxx4000 nid=0x804 runnable [0x000xxxx000]
   java.lang.Thread.State: RUNNABLE
	at java.util.HashMap$TreeNode.balanceDeletion(HashMap.java:2282)
	at java.util.HashMap$TreeNode.removeTreeNode(HashMap.java:2094)
	at java.util.HashMap.removeNode(HashMap.java:839)
	at java.util.HashMap.remove(HashMap.java:798)
	at java.util.HashSet.remove(HashSet.java:235)
	at com.alibaba.jvm.sandbox.core.enhance.weaver.EventProcessor.clean(EventProcessor.java:189)
	at com.alibaba.jvm.sandbox.core.enhance.weaver.EventProcessor$Process.popInvokeId(EventProcessor.java:65)
	at com.alibaba.jvm.sandbox.core.enhance.weaver.EventListenerHandler.handleOnEnd(EventListenerHandler.java:420)
	at com.alibaba.jvm.sandbox.core.enhance.weaver.EventListenerHandler.handleOnReturn(EventListenerHandler.java:389)
	at java.com.alibaba.jvm.sandbox.spy.Spy.spyMethodOnReturn(Spy.java:192)
	at com.alibaba.dubbo.rpc.proxy.javassist.JavassistProxyFactory$1.doInvoke(JavassistProxyFactory.java:46)
	at com.alibaba.dubbo.rpc.proxy.AbstractProxyInvoker.invoke(AbstractProxyInvoker.java:72)
	at com.alibaba.dubbo.rpc.protocol.InvokerWrapper.invoke(InvokerWrapper.java:53)
	at com.alibaba.extension.filter.AccessInvokeLogFilter.invoke(AccessInvokeLogFilter.java:29)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.filter.ExceptionFilter.invoke(ExceptionFilter.java:64)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.csp.sentinel.adapter.dubbo.SentinelDubboProviderFilter.invoke(SentinelDubboProviderFilter.java:66)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:75)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.filter.TimeoutFilter.invoke(TimeoutFilter.java:42)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.protocol.dubbo.filter.TraceFilter.invoke(TraceFilter.java:78)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.filter.ContextFilter.invoke(ContextFilter.java:60)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.filter.GenericFilter.invoke(GenericFilter.java:112)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.filter.ClassLoaderFilter.invoke(ClassLoaderFilter.java:38)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.filter.EchoFilter.invoke(EchoFilter.java:38)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol$1.reply(DubboProtocol.java:108)
	at com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.handleRequest(HeaderExchangeHandler.java:84)
	at com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.received(HeaderExchangeHandler.java:170)
	at com.alibaba.dubbo.remoting.transport.DecodeHandler.received(DecodeHandler.java:52)
	at com.alibaba.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(ChannelEventRunnable.java:82)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
"DubboServerHandler-1xxxx:xxxxx-thread-724" #1879 daemon prio=5 os_prio=0 tid=0x00xxxx800 nid=0x7ca runnable [0x0000xxx000]
   java.lang.Thread.State: RUNNABLE
	at java.util.HashMap$TreeNode.find(HashMap.java:1865)
	at java.util.HashMap$TreeNode.getTreeNode(HashMap.java:1873)
	at java.util.HashMap.removeNode(HashMap.java:823)
	at java.util.HashMap.remove(HashMap.java:798)
	at java.util.HashSet.remove(HashSet.java:235)
	at com.alibaba.jvm.sandbox.core.enhance.weaver.EventProcessor.clean(EventProcessor.java:189)
	at com.alibaba.jvm.sandbox.core.enhance.weaver.EventProcessor$Process.popInvokeId(EventProcessor.java:65)
	at com.alibaba.jvm.sandbox.core.enhance.weaver.EventListenerHandler.handleOnEnd(EventListenerHandler.java:420)
	at com.alibaba.jvm.sandbox.core.enhance.weaver.EventListenerHandler.handleOnReturn(EventListenerHandler.java:389)
	at java.com.alibaba.jvm.sandbox.spy.Spy.spyMethodOnReturn(Spy.java:192)
	at com.alibaba.dubbo.rpc.proxy.javassist.JavassistProxyFactory$1.doInvoke(JavassistProxyFactory.java:46)
	at com.alibaba.dubbo.rpc.proxy.AbstractProxyInvoker.invoke(AbstractProxyInvoker.java:72)
	at com.alibaba.dubbo.rpc.protocol.InvokerWrapper.invoke(InvokerWrapper.java:53)
	at com.alibaba.extension.filter.AccessInvokeLogFilter.invoke(AccessInvokeLogFilter.java:29)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.filter.ExceptionFilter.invoke(ExceptionFilter.java:64)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.csp.sentinel.adapter.dubbo.SentinelDubboProviderFilter.invoke(SentinelDubboProviderFilter.java:66)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:75)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.filter.TimeoutFilter.invoke(TimeoutFilter.java:42)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.protocol.dubbo.filter.TraceFilter.invoke(TraceFilter.java:78)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.filter.ContextFilter.invoke(ContextFilter.java:60)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.filter.GenericFilter.invoke(GenericFilter.java:112)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.filter.ClassLoaderFilter.invoke(ClassLoaderFilter.java:38)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.filter.EchoFilter.invoke(EchoFilter.java:38)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol$1.reply(DubboProtocol.java:108)
	at com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.handleRequest(HeaderExchangeHandler.java:84)
	at com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.received(HeaderExchangeHandler.java:170)
	at com.alibaba.dubbo.remoting.transport.DecodeHandler.received(DecodeHandler.java:52)
	at com.alibaba.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(ChannelEventRunnable.java:82)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
"DubboServerHandler-xxxx:xxxx-thread-735" #1890 daemon prio=5 os_prio=0 tid=0x000xxxx800 nid=0x7d5 runnable [0x0000xxxxx00]
   java.lang.Thread.State: RUNNABLE
	at java.util.HashMap$TreeNode.putTreeVal(HashMap.java:2002)
	at java.util.HashMap.putVal(HashMap.java:637)
	at java.util.HashMap.put(HashMap.java:611)
	at java.util.HashSet.add(HashSet.java:219)
	at com.alibaba.jvm.sandbox.core.enhance.weaver.EventProcessor.setcurrentThread(EventProcessor.java:147)
	at com.alibaba.jvm.sandbox.core.enhance.weaver.EventProcessor$Process.pushInvokeId(EventProcessor.java:45)
	at com.alibaba.jvm.sandbox.core.enhance.weaver.EventListenerHandler.handleOnBefore(EventListenerHandler.java:353)
	at java.com.alibaba.jvm.sandbox.spy.Spy.spyMethodOnBefore(Spy.java:164)
	at com.alibaba.dubbo.rpc.proxy.javassist.JavassistProxyFactory$1.doInvoke(JavassistProxyFactory.java)
	at com.alibaba.dubbo.rpc.proxy.AbstractProxyInvoker.invoke(AbstractProxyInvoker.java:72)
	at com.alibaba.dubbo.rpc.protocol.InvokerWrapper.invoke(InvokerWrapper.java:53)
	at com.alibaba.extension.filter.AccessInvokeLogFilter.invoke(AccessInvokeLogFilter.java:29)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.filter.ExceptionFilter.invoke(ExceptionFilter.java:64)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.csp.sentinel.adapter.dubbo.SentinelDubboProviderFilter.invoke(SentinelDubboProviderFilter.java:66)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:75)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.filter.TimeoutFilter.invoke(TimeoutFilter.java:42)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.protocol.dubbo.filter.TraceFilter.invoke(TraceFilter.java:78)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.filter.ContextFilter.invoke(ContextFilter.java:60)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.filter.GenericFilter.invoke(GenericFilter.java:112)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.filter.ClassLoaderFilter.invoke(ClassLoaderFilter.java:38)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.filter.EchoFilter.invoke(EchoFilter.java:38)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol$1.reply(DubboProtocol.java:108)
	at com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.handleRequest(HeaderExchangeHandler.java:84)
	at com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.received(HeaderExchangeHandler.java:170)
	at com.alibaba.dubbo.remoting.transport.DecodeHandler.received(DecodeHandler.java:52)
	at com.alibaba.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(ChannelEventRunnable.java:82)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)

這四個(gè)線程都是 jvm-sandbox 的執(zhí)行線程,這部分執(zhí)行代碼并不在應(yīng)用層面,而是應(yīng)用掛載的 jvm-sandbox,目前是用這個(gè)來(lái)對(duì)方法執(zhí)行攔截,打標(biāo),mock,主要是為了全鏈路壓測(cè)引入的。

jvm-sandbox 分支

下載下來(lái)了 jvm-sandbox 的源碼,我在 com.alibaba.jvm.sandbox.core.enhance.weaver.EventProcessor 類里并沒(méi)有看到相應(yīng)的 hashmap 的操作,懷疑是改動(dòng)了 jvm-sandbox 源碼,悄悄的搞到了公司的 jvm-sandbox 分支源碼,發(fā)現(xiàn)如下: 

增加了一個(gè) HashSet 來(lái)記錄當(dāng)前線程集合,這里的 HashSet 的定義是在單線程執(zhí)行的方法體外,會(huì)被多線程訪問(wèn)到,這就意味著它存在線程安全的問(wèn)題。HashSet 的底層實(shí)現(xiàn)是 HashMap ,這也是為什么我們看到堆棧都是 HashMap 的插入查找移除的方法。

原因分析

具體原因沒(méi)有去深究(如果去生產(chǎn)環(huán)境導(dǎo)出堆信息找到這個(gè) map,然后去看這里面的結(jié)構(gòu),理論上是可以分析出這個(gè) hashmap 里面的某棵樹(shù)是不是出現(xiàn)了問(wèn)題),因?yàn)椴缓脧?fù)現(xiàn),多線程這種需要看臉的報(bào)錯(cuò),我自己寫(xiě)了測(cè)試用例可以做到增刪查失敗的情況,但是很難判斷這種性能效率問(wèn)題,因?yàn)?nbsp;HashMap 本身是一個(gè)數(shù)組 + 鏈表的結(jié)構(gòu),這種結(jié)構(gòu)在遇到 hash 沖突嚴(yán)重的時(shí)候鏈表會(huì)轉(zhuǎn)換為一顆紅黑樹(shù),如果這時(shí)候是多線程對(duì)這顆紅黑樹(shù)進(jìn)行了增加和移除查找操作,紅黑樹(shù)是需要自平衡的,多線程的時(shí)候自平衡的過(guò)程中運(yùn)氣不好會(huì)導(dǎo)致自鎖和查詢效率極低,甚至引發(fā)死循環(huán)的概率,我沒(méi)有深究過(guò)它的源碼,但是我們可以想象父節(jié)點(diǎn)指針指向孩子節(jié)點(diǎn),這個(gè)時(shí)候查詢操作本來(lái)是正常往下走的,紅黑樹(shù)發(fā)生了自平衡,很可能進(jìn)入這顆紅黑樹(shù)的時(shí)候進(jìn)入死循環(huán),或者查詢效率及其低下,for 循環(huán)次數(shù)過(guò)多。

首先舉個(gè)最簡(jiǎn)單的例子,假設(shè) HashMap 的鏈表已經(jīng)形成了紅黑樹(shù),里面取某一條鏈的 root 節(jié)點(diǎn),當(dāng)你多線程進(jìn)行操作這條鏈的時(shí)候就有可能會(huì)發(fā)生兩個(gè)父節(jié)點(diǎn)互相引用的情況,因?yàn)槎嗑€程下自平衡的結(jié)果結(jié)構(gòu)不確定,這樣在取 root 節(jié)點(diǎn)的時(shí)候就有可能會(huì)陷入這個(gè)死循環(huán)。

這個(gè)假設(shè)理論上在沒(méi)有變換為紅黑樹(shù)的情況下是個(gè)鏈表也應(yīng)該是成立的,JDK8 之前,比如 JDK7 的 hash 沖突是使用的純鏈表,而且是頭插法的方式做的擴(kuò)容,這個(gè)多線程情況下在一定概率會(huì)出現(xiàn)一個(gè)環(huán)形的引用關(guān)系導(dǎo)致死循環(huán),因?yàn)楣?jié)點(diǎn)如果出現(xiàn)相互指向的話,這個(gè)鏈表的查詢會(huì)進(jìn)入死循環(huán)。JDK8 之后用的是尾插法擴(kuò)容不會(huì)有鏈表的死循環(huán)引用問(wèn)題,但是會(huì)出現(xiàn)丟失數(shù)據(jù)的情況,其次就是變成紅黑樹(shù)之后,這個(gè)過(guò)程如果發(fā)生自平衡就會(huì)變成不可控。

所以在多線程情況下一定不要去使用 HashMap ,就如同上面的問(wèn)題,要解決:

如果要用,將 HashMap 放入單個(gè)的方法體內(nèi)用,避免線程安全問(wèn)題。

使用 ConcurrentHashMap,缺點(diǎn)就是性能會(huì)下降,畢竟 jvm-sandbox 是在最底層進(jìn)行類方法執(zhí)行的攔截標(biāo)記等操作的,效率是非常非常重要的。

以上就是修改jvm-sandbox源碼導(dǎo)致線程安全分析的詳細(xì)內(nèi)容,更多關(guān)于jvm-sandbox線程安全的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringSecurity報(bào)錯(cuò)authenticationManager must be spec的解決

    SpringSecurity報(bào)錯(cuò)authenticationManager must be 

    這篇文章主要介紹了SpringSecurity報(bào)錯(cuò)authenticationManager must be spec的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 解決springboot整合cxf啟動(dòng)報(bào)錯(cuò),原因是版本問(wèn)題

    解決springboot整合cxf啟動(dòng)報(bào)錯(cuò),原因是版本問(wèn)題

    這篇文章主要介紹了解決springboot整合cxf啟動(dòng)報(bào)錯(cuò),原因是版本問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 聊聊Java BigInteger里面的mod和remainder的區(qū)別

    聊聊Java BigInteger里面的mod和remainder的區(qū)別

    這篇文章主要介紹了聊聊Java BigInteger里面的mod和remainder的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java之while與do-while循環(huán)的用法詳解

    Java之while與do-while循環(huán)的用法詳解

    在上一篇文章中,給大家講解了循環(huán)的概念,并重點(diǎn)給大家講解了for循環(huán)的使用。但在Java中,除了for循環(huán)之外,還有while、do-while、foreach等循環(huán)形式。這篇文章給大家講解while循環(huán)的使用
    2023-05-05
  • Java?Collection?接口和常用方法綜合詳解

    Java?Collection?接口和常用方法綜合詳解

    Collection派生出三個(gè)子接口,Set代表不可重復(fù)的無(wú)序集合、List代表可重復(fù)的有序集合、Queue是java提供的隊(duì)列實(shí)現(xiàn),通過(guò)它們不斷的擴(kuò)展出很多的集合類,接下來(lái)我們?cè)敿?xì)介紹一下
    2021-11-11
  • Spring Boot 自動(dòng)配置之條件注解淺析

    Spring Boot 自動(dòng)配置之條件注解淺析

    這篇文章主要介紹了Spring Boot 自動(dòng)配置之條件注解淺析,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-02-02
  • 基于JVM 調(diào)優(yōu)的技巧總結(jié)分析

    基于JVM 調(diào)優(yōu)的技巧總結(jié)分析

    本篇文章是對(duì)JVM 調(diào)優(yōu)的技巧進(jìn)行了總結(jié)和分析。需要的朋友參考下
    2013-05-05
  • 深入淺析Java中普通代碼塊、構(gòu)造代碼塊與靜態(tài)代碼塊

    深入淺析Java中普通代碼塊、構(gòu)造代碼塊與靜態(tài)代碼塊

    這篇文章主要介紹了Java中普通代碼塊、構(gòu)造代碼塊與靜態(tài)代碼塊的相關(guān)資料,靜態(tài)代碼塊>Main()>構(gòu)造代碼塊 。非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-08-08
  • IntelliJ IDEA使用tomcat和jetty配置詳解

    IntelliJ IDEA使用tomcat和jetty配置詳解

    這篇文章主要介紹了IntelliJ IDEA使用tomcat和jetty配置詳解,以便進(jìn)一步地開(kāi)發(fā)和調(diào)試,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • Java抽象類和接口使用梳理

    Java抽象類和接口使用梳理

    對(duì)于面向?qū)ο缶幊虂?lái)說(shuō),抽象是它的一大特征之一,在?Java?中可以通過(guò)兩種形式來(lái)體現(xiàn)OOP的抽象:接口和抽象類,下面這篇文章主要給大家介紹了關(guān)于Java入門(mén)基礎(chǔ)之抽象類與接口的相關(guān)資料,需要的朋友可以參考下
    2022-02-02

最新評(píng)論