java 程序中怎么保证多线程的运行安全?
2021-10-22
展开全部
Concurrentmap 保证每个调用(例如没有发送的 putif)都是原子操作,独立于多个线程,但它不保证多个调用也是原子的。在上面实现的 getkeybm 方法中,concurrentmap 方法被多次调用,线程之间必然存在竞争,从而导致不正确的最终结果。现在的目标是,将以下操作序列视为原子操作: “对于每个分隔的单词,调用 getkeybm 方法,取出相应的代码(如果存在) ,如果不存在,将其添加到 keytotal,并给它一个编码,即 keytotal 中的变量数加1。”最直观的方法是块同步: (keytotal) integer = keytotaltotal。如果(value = null){ value = keytotal。; }.总大小() + 1; keytotal。使用法线贴图。如果你使用 java8,concurrent map 有一个类似的方法 computeif sent that works: keytotal。如果没有 computeif (word,k-& gt; keytotal.size () + 1) ; 这确保了原子操作。Computeif abroad 方法使用第二个参数生成一个值,以便在单词 key 不存在的情况下将其放入映射中,这与下面的代码相同,并且它是 atomic: v teifabssent (k key,function & lt; ?超级 k?Extends v & gt; mapping function) : if (map.get (key) = null) v newvalue = mapping function.apply (key) ; if (newvalue!= null)返回 map.putifabsent (key,newvalue) ; }刚好与您的目标一致。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询