当前位置: 首页 > news >正文

认识电子商务网站建设技术网站建设作者墙这个模板

认识电子商务网站建设技术,网站建设作者墙这个模板,2345网址大全首页,在线手机网页制作点击上方蓝字 ↑↑ Throwable文摘关注公众号设置星标#xff0c;不定时推送高质量原创文章关注前提这篇文章介绍一下日常开发中并行流ParallelStream中隐藏的陷阱#xff0c;这个问题其实离我们很近#xff0c;特别是喜欢使用JDK1.8的流式编程的伙伴#xff0c;应该会深有感… 点击上方蓝字 ↑↑ Throwable文摘关注公众号设置星标不定时推送高质量原创文章关注前提这篇文章介绍一下日常开发中并行流ParallelStream中隐藏的陷阱这个问题其实离我们很近特别是喜欢使用JDK1.8的流式编程的伙伴应该会深有感触。一个故意而为的例子下面举一个故意而为的例子实际上应该不会有类似的业务代码public class ParallelStreamMain {    public static void main(String[] args) throws Exception {        List array  new ArrayList();        List item1  new ArrayList();        List item2  new ArrayList();        List target  new ArrayList(100);        array.add(item1);        array.add(item2);        array.parallelStream().forEach(x - {for (int i  0; i 100000; i) {                target.add(i);            }        });        System.out.println(target.size());    }}某一次执行结果为163913。如果不停地执行这个main方法最终都会得到一个非200000的结果这里的问题就在于使用了并行流parallelStream()方法。ParallelStream底层使用了Fork/Join框架实现也就是应用了线程池ForkJoinPool把并行流中的节点抽象为ForkJoinTask进行计算背后用到的任务窃取等原理这里就不进行展开只需要明确ForkJoinPool一般使用Runtime.getRuntime().availableProcessors()(此值一般认为是物理机器的逻辑核心数量)作为并行度(parallelism)简单认为是可并发执行的任务数并不是工作线程数。多核机器中使用ParallelStream在流的节点中的所有操作都相当于在「一个多线程环境中」进行操作里面的所有操作都会产生不可预期的结果例如可能会数组越界、添加元素丢失、部分下标index的引用为NULL等等。一个仿真例子写这篇文章不是有意为之其实很早之前笔者曾经遇到一个比较隐蔽的生产故障其中有一段访问量比较低的代码大致如下Dataprivate static class OrderDTO {    private String orderId;    private OrderStatus orderStatus;    private BigDecimal amount;    private Long customerId;}Dataprivate static class Order {    private Long id;    private String orderId;    private Integer orderStatus;    private BigDecimal amount;    private Long customerId;    private OffsetDateTime createTime;    private OffsetDateTime editTime;}public void groupByOrderStatus(Long customerId) {    List orders  orderDao.selectByCustomerId(customerId);    List orderDTOList  new ArrayList();    orders.parallelStream().forEach(order - {        OrderDTO dto  new OrderDTO();        ......        orderDTOList.add(dto);    });    Map collect              orderDTOList.stream().collect(Collectors.groupingBy(item - item.getOrderStatus().getCode()));    ......}该方法的功能是通过客户ID查询订单列表然后把订单列表转化为OrderDTO列表然后再按照订单状态字段进行分组。通过生产日志和测试回归发现上面的代码段中groupByOrderStatus()方法会偶发空指针异常。初次出现问题的时候由于开发者通过Lambda表达式把多处代码压缩为1行所以从异常栈比较难排查具体发生问题的代码后面把Lambda表达式以句点起点拆分为多行上线后观察一段时间最终定位到发生空指针异常的代码段为Collectors.groupingBy(item - item.getOrderStatus().getCode())也就是OrderDTO实例中的orderStatus为空对象。这里显然groupByOrderStatus()方法其实是被封闭在线程栈中调用本不应该有多个线程去并发修改其中的内容这里只剩下一个疑点使用了parallelStream()。后来直接把parallelStream()修改为stream()重新上线该空指针问题不再复现。Lambda/Stream其实并不是天然线程安全的线程安全的前提是它们本身被线程封闭调用并且不引入多线程环境像使用了并行流本质就是引入了多线程环境。所以在开发功能的时候需要仔细思考一下是否真的有必要使用Lambda和流式编程是否真的有必要用到并行流如果使用了并行流是否需要考虑引入额外的同步机制例如锁其实并发并不能提高性能只能提高吞吐量应该着重去发现和优化性能瓶颈而不是拼命地把上游改造成并发调用。❝笔者有代码洁癖当时还发现了上面的代码存在映射操作正确来说应该使用map()函数而不是forEach()去遍历元素重新装进去另一个列表方法中的逻辑体现了原开发者其实对Lambda一知半解。❞小结回到最初那个问题其实使用并行流也可以保证执行结果和预期一致不过一定需要引入额外的同步机制例如这里使用「监视器」进行同步public class ParallelStreamMain {    public static void main(String[] args) throws Exception {        List array  new ArrayList();        List item1  new ArrayList();        List item2  new ArrayList();        List target  new ArrayList(100);        array.add(item1);        array.add(item2);final Object monitor  new Object();        array.parallelStream().forEach(x - {synchronized (monitor) {for (int i  0; i 100000; i) {                    target.add(i);                }            }        });        System.out.println(target.size());    }}上面的方法无论执行多少次最终都只会输出200000。(本文完 c-1-d e-a-20200710)
http://www.pierceye.com/news/737262/

相关文章:

  • 老渔哥网站建设公司重庆建设厂
  • 怎么建网站手机版松门建设规划局网站
  • wordpress网站破解整容医院网络建设公司
  • app如何推广深圳网络排名优化
  • 网站seo规范南昌it制作电商网站的公司
  • 深圳网站设计 工作室深圳品牌设计工作室
  • 手机网站静态动态wordpress注意
  • 什么网站没人做v5shop微分销系统
  • 做鞋子的网站品牌vi设计包括哪些
  • 做产品类的工作上什么网站好asp.net做的网站模板下载
  • 金融公司网站规划方案我司网站改版上线网站建设
  • 城乡与住房建设部网站首页深圳响应式设计企业网站
  • 做网站 带宽 多少钱做电影网站的服务器需要多大
  • 西安网站建设全包用手机制作游戏的软件
  • 哪个网站生鲜配送做的好drupal wordpress网站
  • 网站后台需要多少建设部举报网站
  • 重庆建筑证书查询网站wordpress博客怎么访问不了
  • 网站案例鉴赏wordpress html5视频
  • 免费申请网站 主机 空间网站不稳定
  • 建立个人网站视频教程中国空间站和国际空间站对比
  • 佛山网站seo推广推荐一个专门做海鲜的网站
  • 长春网站建设与健网站外链如何做
  • 网站开发国内现状网站建设与维护教学计划
  • 如何解决网站图片打开慢网站如何做跳转
  • 网站开发作用大学生网络营销策划书
  • 有域名了如何建网站用自己的身份做网站备案
  • 免费的黄冈网站有哪些平台游戏软件上海网站建设自学
  • 网站建设摊销几年wordpress怎样建立二级菜单
  • 营销方案案例北京搜索引擎优化seo专员
  • 网站建设是什么科目wordpress 火车头