博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
近期小结
阅读量:6983 次
发布时间:2019-06-27

本文共 1809 字,大约阅读时间需要 6 分钟。

CompletableFuture 是jdk8提供的异步类,远比Future强大!

问题是:thenRun/thenRunAsync 啥关系?使用另一个线程完成,就是说不对主线程造成影响吗???
小知识:该类的多数async方法,都有两种重载形式,一种是使用默认的fork/join框架,一种是提供threadpool。

 

ConcurrentHashMap,可以支持超过Integer.MAX的键值对,但size()只能返回int,所以JDK8又添加了一个mapCount()方法。

 

我们已知JDK中的AtomicXxx类(如AtomicInteger),提供了在非同步环境下的原子操作。

如常见的atomic.incrementAndGet(),其实就等同于++i,以及等同于i++的getAndIncrement(),还有--i/i--/i+n/i-n等操作。
这些操作虽然保证了原子性,但是如果你想同时调用两个方法,如get()之后再做判断再设置,那这就是两个独立的原子操作,合起来就不是原子操作啦!
这时就需要do{..} while(!atomic.compareAndSet(oldVal, newVal))了,就是所谓的CAS来保证同步!

JDK8中还提供了简单的方法:updateAndGet和accumulateAndGet,都是接收lambda,本质是一样的,可以看一下源码。

当然,不要怀疑do{..} while(!atomic.compareAndSet(oldVal, newVal))的性能,因为会映射成一个底层的处理器操作,所以效率极高,比用锁快的多。

 

一般情况下这些原子类是足够了,但还有一些情况会出现效率问题,如很多线程同时竞争,因为一直比较,会导致严重的性能问题。

如果你不需要在中途获取最终的值,那完全可以使用LongAdder或LongAccumulator -- 只需要在最后累积一下即可,效率极高。
LongAdder可以看作LongAccumulator的特殊情况:new LongAccumulator(Long::sum, 0L);。
就不多说了。

 

最后再次呼吁大家使用JDK8的日期、时间API,相当无敌。

举个例子:①计算你到现在总共生活了多少天?②列出21世纪所有的周五。

// 计算出生到现在过去了多少天@Testpublic void days(){    long days = LocalDate.now().until(LocalDate.of(2000, 9, 1), ChronoUnit.DAYS);    System.out.println("从出生到现在,总共过去这么多天: " + Math.abs(days));}// 列出21世纪所有的星期五@Testpublic void fridays(){    List
list = new ArrayList<>(6000);// 55*100 LocalDate start = LocalDate.of(2000, 1, 1); LocalDate end = LocalDate.of(2099, 12, 31); // 防止第一天就是周五,先执行一次nextOrSame LocalDate tmp = start.with(TemporalAdjusters.nextOrSame(DayOfWeek.FRIDAY)); if(tmp.isEqual(start)){ System.out.println("第一天就是周五啦!"); } // 然后,循环计算后面的周五 do{ list.add(tmp); // 第一次是上面计算的周五 tmp = tmp.with(TemporalAdjusters.next(DayOfWeek.FRIDAY)); } while(tmp.isBefore(end)); System.out.println(list.size()); System.out.println(list.get(0)); System.out.println(list.get(list.size() - 1));}

转载地址:http://hgvpl.baihongyu.com/

你可能感兴趣的文章
Nginx与Serssion一致性问题
查看>>
社会化工程攻击针对目标不再仅限最终用户
查看>>
Hadoop源码分析HDFS ClientProtocol——getBlockLocations
查看>>
AndroidWidget实践 --- EverydayTips开发(6)
查看>>
mysql 随机查询数据
查看>>
CodeIgniter学习笔记一
查看>>
workspace-project-target关系与解耦工程结构总结
查看>>
EhCache的配置
查看>>
Linux 设置时区
查看>>
在maven中引用github上的资源
查看>>
4、Angular JS 学习笔记 – 创建自定义指令 [翻译中]
查看>>
Flex手机开发-退出应用程序
查看>>
常用的7大排序算法汇总
查看>>
数字转化成时分秒(二)
查看>>
Golang通过syscall调用win32的Api
查看>>
阿里云Redis (安装包安装篇)
查看>>
Spring Bean的装配(非XML文件方式)
查看>>
100万“愤怒的小鸟”:中国手机开发者生存调查
查看>>
centos 6.3 x86_64安装32位JDK的问题
查看>>
springmvc学习笔记(17)-上传图片
查看>>