摘要:
一、使用场景 Semaphore 翻译成字面意思为 信号量,Semaphore 可以控制同时访问的线程个数。 通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。 信号量主要用于两个目的: 用于多个共享资源的互斥使用; 用于并发线程数的控制。 二、代码实现 阅读全文
摘要:
一、使用场景 通过它可以实现让一组线程等待至某个状态之后再全部同时执行。 CyclicBarrier 中最重要的方法就是 await 方法,它有 2 个重载版本: // 用来挂起当前线程,直至所有线程都到达指定状态再同时执行后续任务 public int await(); // 让这些线程等待至一定 阅读全文
摘要:
一、使用场景 CountDownLatch 类位于 java.util.concurrent 包下,利用它可以实现类似计数器的功能。 比如有一个任务,它要等待其他 6 个任务执行完毕之后才能执行,此时就可以利用 CountDownLatch 来实现这种功能了。 二、代码实现 public class 阅读全文
摘要:
一、前言 在学习集合时,我们就已经知道了 ArrayList 是线程不安全的。 那能不能通过代码来体现呢? 因此,本文将演示 ArrayList 在多线程环境下的线程不安全的问题,并总结常用的解决办法。 二、代码实现 public class AboutList { public static vo 阅读全文
摘要:
一、什么是函数式接口 函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。 函数式接口可以被隐式转换为 lambda 表达式。 如定义了一个函数式接口如下: @FunctionalInterface interface Greeting 阅读全文
摘要:
一、前言 使用 Lamda 表达式解决匿名内部类代码冗余的问题,因为函数式接口可以被隐式转换为 Lambda 表达式; Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中),使用 Lambda 表达式可以使代码变的更加简洁紧凑。 二、前提条件 该接口必须是一个函数式接口(有且仅有一 阅读全文