java map 更新_java8_CurrentHashMap更新

标签:java

CurrentHashMap更新

提要:

CurrentHashMap的线程安全?

多个线程对currentHashMap读取的时候不会破坏其数据结构,

也就是说读写的时候是线程安全的;

但是操作数据的顺序需要额外的同步处理,保证同步代码操作的原子性

原子更新

lambda表达式函数表示要执行的同步代码,

使用compute原子更新,保证(获取-计算-更新)同步代码的原子性

private ConcurrentHashMap map=new ConcurrentHashMap<>();

public CurrentHashMapTest(){

map.put("55555",5);

map.put("666666",6);

map.put("7777777",7);

}

/**

* java 8提供了很多用于原子更新的方法

* 函数运行时其他一些更新映射的操作可能会被阻塞

*/

private void atomicUpdate(){

String word="55555";

//接受一个函数,参数为键及其关联的值,若不存在键,则值为null;

//函数返回更新后的值;

map.compute(word,(k,v)->{

return null==v?1:v+1;

});

//存在时才更新值,参数为value

map.computeIfPresent(word,(k,v)->v+1);

//不存在时才计算新值,参数为key

map.computeIfAbsent(word,(k)->1);

//k不存在,返回初始值;

// k存在,调用函数对初始值和旧值计算返回

map.merge(

word,//key

1,//初始

(existingValue,newValue)->existingValue+newValue

);

}

批量数据操作

返回结果的时候除非可以确保没有其他值修改,否则应该作为近似值

(tip:可能在你计算到值还未返回的时候已经有其他线程修改了数据)

(如何保证?锁定数据)

private void batchOperation(){

//search()查找,reduce()聚合,foreach()遍历应用

//以上三个方法都有针对key,value,k&v,entry四个版本

//第一个参数为并行阀值,超过该数量则并行处理

//search()方法查找到第一个则返回

map.search(1,(k,v)->{

if(k.endsWith("5")&&v>4){

return k;

}else{

return null;

}

});

//foreach()遍历数据,应用函数处理

//1.对每个数据项默认应用

map.forEach(1,(k,v)->{

LOGGER.info(k+"`s length is"+v);

});

//2.先使用转换器函数,再对结果应用消费者函数

map.forEach(1,

(k,v)->k+"`s length is"+v,//转换器可作为一个过滤器,如果返回null,则不应用消费者函数

(str)->LOGGER.info(str));

//reduce()对数据执行累加操作,返回结果

map.reduceValues(1,

v->Integer.valueOf(v),//转换器

Integer::sum);//聚合操作

//reduce***ToLong/Integer/Double(),提供int,long,double原始类型的输出;

}

线程安全的Set

/**

* 获取一个大的,线程安全的Set

*/

private void setView(){

//返回一个线程安全的Set,实际上是对ConcurrentHashMap的封装

Set keys=map.newKeySet();

Set keySet=ConcurrentHashMap.newKeySet();

//delete,无法添加add(因为没有值)

keys.remove("55555");

//参数提供了一个默认值,如果添加一个键,对应的值不存在,则使用默认值

keys=map.keySet(1);

//add

keys.add("7777777");

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值