摘要: Java 8已经发行两年多,但很多人仍然在使用JDK7。对企业来说,技术上谨慎未必是坏事,但对个人学习而言,不去学习新技术就很可能被技术抛弃。Java 8一个重要的变更是引入Lambda表达式(lambda expression)。不要怕,具体到语言层面上Lambda表达式不过是一种新的语法而已,有了它,Java将开启函数式编程的大门。 阅读全文
posted @ 2016-10-09 10:09 CarpenterLee 阅读(8179) 评论(21) 推荐(16) 编辑
 
摘要: Introduction 关于 C++标准模板库(Standard Template Library, STL) 的书籍和资料有很多,关于 Java集合框架(Java Collections Framework, JCF) 的资料却很少,甚至很难找到一本专门介绍它的书籍,这给Java学习者们带来不小 阅读全文
posted @ 2016-05-31 15:23 CarpenterLee 阅读(24548) 评论(11) 推荐(16) 编辑
  2018年8月30日
摘要: 构造一个线程池为什么需要几个参数?如果避免线程池出现OOM?`Runnable`和`Callable`的区别是什么?本文将对这些问题一一解答,同时还将给出使用线程池的常见场景和代码片段。`Executors`为我们提供了构造线程池的便捷方法,对于服务器程序我们应该杜绝使用这些便捷方法,而是直接使用线程池`ThreadPoolExecutor`的构造方法,避免无界队列可能导致的OOM以及线程个数限制不当导致的线程数耗尽等问题。`ExecutorCompletionService`提供了等待所有任务执行结束的有效方式,如果要设置等待的超时时间,则可以通过`CountDownLatch`完成。 阅读全文
posted @ 2018-08-30 08:32 CarpenterLee 阅读(116664) 评论(11) 推荐(50) 编辑
  2018年1月8日
摘要: 动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询、测试框架的后端mock、RPC,Java注解对象获取等。静态代理的代理关系在编译时就确定了,而动态代理的代理关系是在编译期确定的。今天我们来探讨Java中两种常见的动态代理方式:JDK原生动态代理和CGLIB动态代理。 阅读全文
posted @ 2018-01-08 09:08 CarpenterLee 阅读(36384) 评论(10) 推荐(32) 编辑
  2017年12月22日
摘要: Nginx限速模块分为哪几种?按请求速率限速的burst和nodelay参数是什么意思?漏桶算法和令牌桶算法究竟有什么不同?本文将带你一探究竟。我们会通过一些简单的示例展示Nginx限速模块是如何工作的,然后结合代码讲解其背后的算法和原理。 阅读全文
posted @ 2017-12-22 09:42 CarpenterLee 阅读(12297) 评论(1) 推荐(7) 编辑
  2017年12月16日
摘要: 能够图形化展示表达式语法树,不但能够计算加减乘除,还能够匹配小括号~。从朴素的界面配色到简单易懂错误提示,无不体现了“用户体验”至上的设计理念;代码异常处理全面合理、滴水不漏,代码缩进优雅大方,变量命名直观易懂;再结合长度适中简单明了的注释,程序整体给人一种清新脱俗之感。背后不难看出作者对学习的热爱以及对设计的苛求,工匠精神可见一斑,真可谓是大学数据结构学以致用的典范! 阅读全文
posted @ 2017-12-16 09:58 CarpenterLee 阅读(5100) 评论(2) 推荐(0) 编辑
  2017年11月25日
摘要: 多线程编程中,当代码需要同步时我们会用到锁。Java为我们提供了内置锁(`synchronized`)和显式锁(`ReentrantLock`)两种同步方式。显式锁是JDK1.5引入的,这两种锁有什么异同呢?是仅仅增加了一种选择还是另有其因?本文为您一探究竟。内置锁能够解决大部分需要同步的场景,只有在需要额外灵活性是才需要考虑显式锁,比如可定时、可中断、多等待队列等特性。显式锁虽然灵活,但是需要显式的申请和释放,并且释放一定要放到finally块中,否则可能会因为异常导致锁永远无法释放!这是显式锁最明显的缺点。 阅读全文
posted @ 2017-11-25 20:52 CarpenterLee 阅读(7118) 评论(0) 推荐(3) 编辑
  2017年9月2日
摘要: Java FlameGraph(火焰图)能够非常直观的展示java程序的性能分析结果,方便发现程序热点和进一步调优。本文将展示如何使用linux perf工具生成java程序的火焰图。 阅读全文
posted @ 2017-09-02 17:59 CarpenterLee 阅读(12049) 评论(0) 推荐(0) 编辑
  2017年4月18日
摘要: 本系列文将帮助你理解Java函数式编程的用法、原理。Java 8已经发行两年多,但很多人仍然在使用JDK7。对企业来说,技术上谨慎未必是坏事,但对个人学习而言,不去学习新技术就很可能被技术抛弃。Java 8一个重要的变更是引入函数式编程和Lambda表达式(lambda expression),这听起来似乎很牛,有种我虽然不知道Lambda表达式是什么,但我仍然觉得很厉害的感觉。 阅读全文
posted @ 2017-04-18 18:53 CarpenterLee 阅读(18387) 评论(7) 推荐(6) 编辑
  2017年4月11日
摘要: 实现全局自增id最简单有效的方式是什么? 包定义了一些常见类型的原子变量。这些原子变量为我们提供了一种操作单一变量无锁( lock free )的线程安全( thread safe )方式。实际上该包下面的类为我们提供了类似 变量的特性,同时还提供了诸如 的功能。不使用锁实现线程安全听起来似乎很不可 阅读全文
posted @ 2017-04-11 19:22 CarpenterLee 阅读(4914) 评论(0) 推荐(2) 编辑
  2017年4月7日
摘要: 实验的结果可以总结如下: 对于简单操作,比如最简单的遍历,Stream串行API性能明显差于显示迭代,但并行的Stream API能够发挥多核特性。 对于复杂操作,Stream串行API性能可以和手动实现的效果匹敌,在并行执行时Stream API效果远超手动实现。 所以,如果出于性能考虑,1. 对于简单操作推荐使用外部迭代手动实现,2. 对于复杂操作,推荐使用Stream API, 3. 在多核情况下,推荐使用并行Stream API来发挥多核优势,4.单核情况下不建议使用并行Stream API。 阅读全文
posted @ 2017-04-07 08:12 CarpenterLee 阅读(9256) 评论(2) 推荐(10) 编辑
  2017年3月28日
摘要: 前面我们已经学会 "如何使用Stream API" ,用起来真的很爽,但简洁的方法下面似乎隐藏着无尽的秘密,如此强大的API是如何实现的呢?Pipeline是怎么执行的,每次方法调用都会导致一次迭代吗?自动并行又是怎么做到的,线程个数是多少?本节我们学习Stream流水线的原理,这是Stream实现 阅读全文
posted @ 2017-03-28 22:08 CarpenterLee 阅读(38202) 评论(23) 推荐(30) 编辑