24、CompletableFuture:异步编程没那么难

前面我们不止一次提到,用多线程优化性能,其实不过就是将串行操作变成并行操作。如果仔细观察,你还会发现在串行转换成并行的过程中,一定会涉及到异步化,例如下面的示例代码,现在是串行的,为了提升性能,我们得把它们并行化,那具体实施起来该怎么做呢? 123/...

Java并发编程实战

23、Future:如何用多线程实现最优的“烧水泡茶”程序

在上一篇文章[《22 | Executor与线程池:如何创建正确的线程池?》]中,我们详细介绍了如何创建正确的线程池,那创建完线程池,我们该如何使用呢?在上一篇文章中,我们仅仅介绍了ThreadPoolExecutor的 void execute(R...

Java并发编程实战

22、Executor与线程池:如何创建正确的线程池

虽然在Java语言中创建线程看上去就像创建一个对象一样简单,只需要new Thread()就可以了,但实际上创建线程远不是创建一个对象那么简单。创建对象,仅仅是在JVM的堆里分配一块内存而已;而创建一个线程,却需要调用操作系统内核的API,然后操作系...

Java并发编程实战

21、原子类:无锁工具类的典范

前面我们多次提到一个累加器的例子,示例代码如下。在这个例子中,add10K()这个方法不是线程安全的,问题就出在变量count的可见性和count+=1的原子性上。可见性问题可以用volatile来解决,而原子性问题我们前面一直都是采用的互...

Java并发编程实战

20、并发容器:都有哪些“坑”需要我们填

Java并发包有很大一部分内容都是关于并发容器的,因此学习和搞懂这部分的内容很有必要。 Java 1.5之前提供的同步容器虽然也能保证线程安全,但是性能很差,而Java 1.5版本之后提供的并发容器在性能方面则做了很多优化,并且容器的类型也更加丰富了...

Java并发编程实战

19、CountDownLatch和CyclicBarrier:如何让多线程步调一致

前几天老板突然匆匆忙忙过来,说对账系统最近越来越慢了,能不能快速优化一下。我了解了对账系统的业务后,发现还是挺简单的,用户通过在线商城下单,会生成电子订单,保存在订单库;之后物流会生成派送单给用户发货,派送单保存在派送单库。为了防止漏派送或者重复派送...

Java并发编程实战

18、StampedLock:有没有比读写锁更快的锁

在[上一篇文章]中,我们介绍了读写锁,学习完之后你应该已经知道“读写锁允许多个线程同时读共享变量,适用于读多写少的场景”。那在读多写少的场景中,还有没有更快的技术方案呢?还真有,Java在1.8这个版本里,提供了一种叫StampedLock的锁,它的...

Java并发编程实战

17、ReadWriteLock:如何快速实现一个完备的缓存

前面我们介绍了管程和信号量这两个同步原语在Java语言中的实现,理论上用这两个同步原语中任何一个都可以解决所有的并发问题。那Java SDK并发包里为什么还有很多其他的工具类呢?原因很简单:分场景优化性能,提升易用性。 今天我们就介绍一种非常普遍的并...

Java并发编程实战

16、Semaphore:如何快速实现一个限流器

Semaphore,现在普遍翻译为“信号量”,以前也曾被翻译成“信号灯”,因为类似现实生活里的红绿灯,车辆能不能通行,要看是不是绿灯。同样,在编程世界里,线程能不能执行,也要看信号量是不是允许。 信号量是由大名鼎鼎的计算机科学家迪杰斯特拉(Dijks...

Java并发编程实战

15、Lock和Condition(下):Dubbo如何用管程实现异步转同步

在上一篇文章中,我们讲到Java SDK并发包里的Lock有别于synchronized隐式锁的三个特性:能够响应中断、支持超时和非阻塞地获取锁。那今天我们接着再来详细聊聊Java SDK并发包里的Condition,Condition实现了管程模型...

Java并发编程实战
17879808182268