随笔分类 - java8 & juc & nio
Java的一些补充
摘要:工作中一段时间对数据统计操作比较多,总结了部分常用到的Stream流操作。 1. 过滤并判空 //String fundCode,List<GuaranteeSystemBIDataDetailStatistic> totalSealedStatistics Optional<GuaranteeSy
阅读全文
摘要:1. 通过Executors创建线程池的弊端 在创建线程池的时候,大部分人还是会选择使用Executors去创建。 下面是创建定长线程池(FixedThreadPool)的一个例子,严格来说,当使用如下代码创建线程池时,是不符合编程规范的。 ExecutorService fixedThreadPo
阅读全文
摘要:业务中,要实现数据日终同步,采用将同步文件中的数据封装成List集合分批处理加多线程的方式,根据数据量动态设置线程数,同时控制最大并发数量(业务中有IO操作,避免过大并发导致堵塞),实现效率提高 //最大线程数控制 private static int MAX_THREADS= 5; //跑批分页大
阅读全文
摘要:ArrayList 不是线程安全的,这点很多人都知道,但是线程不安全的原因及表现,怎么在多线程情况下使用ArrayList,可能不是很清楚,这里总结一下。 1. 源码分析 查看 ArrayList 的 add 操作源码如下: /** * Appends the specified element t
阅读全文
摘要:1. 常规元素去重 碰到List去重的问题,除了遍历去重,我们常常想到利用Set集合不允许重复元素的特点,通过List和Set互转,来去掉重复元素。 除此之外,可以利用java8的stream来实现去重 上面的方法在List元素为基本数据类型及String类型时是可以的,但是如果List集合元素为对
阅读全文
摘要:13. 线程池 第四种获取线程的方法:线程池,一个 ExecutorService,它使用可能的几个池线程之一执行每个提交的任务,通常使用 Executors 工厂方法配置。 线程池可以解决两个不同问题:由于减少了每个任务调用的开销,它们通常可以在执行大量异步任务时提供增强的性能,并且还可以提供绑定
阅读全文
摘要:8. 生产者消费者案例-虚假唤醒 参考下面生产者消费者案例: 当多个生产者、消费者同时响应资源时,程序输出如下(商品数出现负数): 原因如下,即产生了虚假唤醒: 解决方法在jdk的wait()方法里已经声明,即需要把wait()方法放在循环里(生产者方法也同下) 9. Condition 线程通信
阅读全文
摘要:5. CountDownLatch 闭锁 Java 5.0 在 java.util.concurrent 包中提供了多种并发容器类来改进同步容器的性能。 CountDownLatch 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。 闭锁可以延迟线程的进度直到其
阅读全文
摘要:1. volatile 关键字与内存可见性 内存可见性(Memory Visibility)是指当某个线程正在使用对象状态而另一个线程在同时修改该状态,需要确保当一个线程修改了对象状态后,其他线程能够看到发生的状态变化。 可见性错误是指当读操作与写操作在不同的线程中执行时,我们无法确保执行读操作的线
阅读全文