本文主要是关于concurrentmap.putifabsent(key,value )用法的内容,具体如下:
在商务中经常遇到这种场合。 全局维护并发贴图,每个贴图关键点对应一个对象。 此对象只需要创建一次。 如果Map中不存在与该key对应的value,则创建该value,如果不存在,则直接返回。
让我们先看看代码:
公共语言(字符串语言,字符串计数,
字符串变量) {
//.
String key=some_string;
本地本地=map.get (key;
if(locale==null ) {
locale=new locale (语言、国家、变量);
map.put(key,locale );
}
返回本地;
}
这个代码要做的是:
调用map.get(key )方法以确定map中是否存在与该key对应的value ) locale对象。
如果返回null,则表示map没有要查找的密钥值映射。 新建Locale对象,并将从new中出来的此对象与key一起放入地图中。
返回最近创建的Locale对象
我们希望确保每次调用getInstance方法时,同一key都会返回同一Local对象引用。 这个代码能实现这个需求吗?
答案在单线程环境中可以满足要求,但在多线程环境中存在线程安全问题。 也就是说,不能保证在并发过程中相同的key返回相同的Local对象引用。
这是因为在上面的代码中存在一个习惯的操作[1],称为推送- if-absent,该操作中存在race condition。
if(locale==null ) {
locale=new locale (语言、国家、变量);
map.put(key,locale );
}
在一个线程完成locale==null的确定和真正将值上传到map之间,其他线程可能已经在对map执行上传操作,因此在进一步执行上传操作时,与同一密钥对应的locale对象将被复盖因此,对贴图的上推权限操作不安全(热安全)。
为了解决这个问题,java 5.0引入了ConcurrentMap接口。 在该接口上,推送操作以原子方法推送(kkey,V value )的形式存在。 正如javadoc所写:
putIfAbsent方法主要在将键-值对添加到ConcurrentHashMap中时确定键-值对是否已经存在。
如果不存在(新条目),则会将键-值对添加到map中并返回null。
如果已经存在,则返回已存在的值,而不复盖现有值。
改造上述方法:
公共语言(字符串语言,字符串计数,
字符串变量) {
//.
String key=some_string;
本地本地=map.get (key;
if(locale==null ) {
locale=new locale (语言、国家、变量);
map.putifabsent(key,locale;
}
返回本地;
}
该代码使用了映射的concurrent格式(ConcurrentMap,ConcurrentHashMap ),并简单地使用了map.putifabsent(key,locale )。 这并不保证同一个key返回同一个Locale对象引用。
这里的错误是putIfAbsent方法有返回值,忽略了返回值很重要。
因此,在使用putIfAbsent方法时,请不要忘记确定返回值。
公共语言(字符串语言,字符串计数,
字符串变量) {
//.
String key=some_string;
本地本地=map.get (key;
if(locale==null ) {
locale=new locale (语言、国家、变量);
localetmp=map.putifabsent(key,locale;
if(tmp!=空) {
本地=tmp;
}
}
返回本地;
}
【实施例1】
import java.util.Map;
import Java.util.concurrent.concurrent hashmap;
公共类测试{
publicstaticvoidmain (字符串[ ] args ) {
测试currentHashMap.putIfAbsent ()
map clientmap=newconcurrenthashmap (;
System.out.println (第一个为空的clientMap );
system.out.println (clientmap : ) clientmap );
System.out.println (;
//向空的clientMap添加新记录
System.out.println (向空clientMap添加新记录);
System.out.println ('添加前的clientMap: ' clientMap );
long netId=1234567L;
String str1='开放发带';
string result=clientmap.putifabsent (netid,str1);
System.out.println ('添加后的clientMap: ' clientMap );
System.out.println (查看返回值的result: ) result );
System.out.println (;
//重叠添加
System.out.println ('重复添加上次记录');
System.out.println ('添加前的clientMap: ' clientMap );
string result2=clientmap.putifabsent (netid,str1);
System.out.println ('添加后的clientMap: ' clientMap );
System.out.println (返回值result: ' result2);
System.out.println (;
}
}
总结
以上是有关concurrentmap.putifabsent(key,value )使用案例的总体内容,希望对大家有所帮助。 感兴趣的人继续参考本网站的其他相关主题。 如果有不足之处,欢迎评论。 感谢朋友们对本站的支持!