![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Future 类 及 线程协作 JUC
文章平均质量分 89
Future 最主要的作用是,比如当做一定运算的时候,运算过程可能比较耗时,有时会去查数据库,或是繁重的计算,比如压缩、加密等,在这种情况下,如果我们一直在原地等待方法返回,显然是不明智的,整体程序的运行效率会大大降低。
Ssssongsmith 奕飞
这个作者很懒,什么都没留下…
展开
-
63-单例模式的双重检查锁模式为什么必须加 volatile?
什么是单例模式单例模式指的是,保证一个类只有一个实例,并且提供一个可以全局访问的入口。为什么需要使用单例模式那么我们为什么需要单例呢?其中**一个理由,那就是为了节省内存、节省计算。**因为在很多情况下,我们只需要一个实例就够了,如果出现更多的实例,反而纯属浪费。下面我们举一个例子来说明这个情况,以一个初始化比较耗时的类来说,代码如下所示:public class ExpensiveResource { public ExpensiveResource() { field1原创 2021-02-10 19:19:00 · 407 阅读 · 10 评论 -
61-什么是 happens-before 规则?
什么是 happens-before 关系Happens-before 关系是用来描述和可见性相关问题的:如果第一个操作 happens-before 第二个操作(也可以描述为,第一个操作和第二个操作之间满足 happens-before 关系),那么我们就说第一个操作对于第二个操作一定是可见的,也就是第二个操作在执行时就一定能保证看见第一个操作执行的结果。不具备 happens-before 关系的例子我们先来举一个不具备 happens-before 关系的例子,从宏观上进一步理解 happens原创 2021-02-06 22:13:59 · 357 阅读 · 0 评论 -
55-Condition、object.wait() 和 notify() 的关系?
Condition 这个接口,来看看它的作用、如何使用,以及需要注意的点有哪些。Condition接口作用我们假设线程 1 需要等待某些条件满足后,才能继续运行,这个条件会根据业务场景不同,有不同的可能性,比如等待某个时间点到达或者等待某些任务处理完毕。在这种情况下,我们就可以执行 Condition 的 await 方法,一旦执行了该方法,这个线程就会进入 WAITING 状态。通常会有另外一个线程,我们把它称作线程 2,它去达成对应的条件,直到这个条件达成之后,那么,线程 2 调用 Condit原创 2021-01-31 22:45:36 · 199 阅读 · 4 评论 -
54-CyclicBarrier 和 CountdownLatch 有什么异同?
CyclicBarrier作用CyclicBarrier 和 CountDownLatch 确实有一定的相似性,它们都能阻塞一个或者一组线程,直到某种预定的条件达到之后,这些之前在等待的线程才会统一出发,继续向下执行。正因为它们有这个相似点,你可能会认为它们的作用是完全一样的,其实并不是。CyclicBarrier 可以构造出一个集结点,当某一个线程执行 await() 的时候,它就会到这个集结点开始等待,等待这个栅栏被撤销。直到预定数量的线程都到了这个集结点之后,这个栅栏就会被撤销,之前等待的线程就原创 2021-01-29 21:08:26 · 125 阅读 · 0 评论 -
53-CountDownLatch 是如何安排线程执行顺序的?
我们先来介绍一下 CountDownLatch,它是 JDK 提供的并发流程控制的工具类,它是在 java.util.concurrent 包下,在 JDK1.5 以后加入的。下面举个例子来说明它主要在什么场景下使用。比如我们去游乐园坐激流勇进,有的时候游乐园里人不是那么多,这时,管理员会让你稍等一下,等人坐满了再开船,这样的话可以在一定程度上节约游乐园的成本。座位有多少,就需要等多少人,这就是 CountDownLatch 的核心思想,等到一个设定的数值达到之后,才能出发。流程图我们把激流勇进的例子原创 2021-01-28 23:54:54 · 232 阅读 · 5 评论 -
52-信号量能被 FixedThreadPool 替代吗?
了解控制并发流程的工具类,作用就是更容易地让线程之间相互配合,比如让线程 A 等待线程 B 执行完毕后再继续执行,来满足业务逻辑。本次我们从 Semaphore(信号量)开始介绍。Semaphore 信号量介绍从图中可以看出,信号量的一个最主要的作用就是,来控制那些需要限制并发访问量的资源。具体来讲,信号量会维护“许可证”的计数,而线程去访问共享资源前,必须先拿到许可证。线程可以从信号量中去“获取”一个许可证,一旦线程获取之后,信号量持有的许可证就转移过去了,所以信号量手中剩余的许可证要减一。同理原创 2021-01-27 23:51:09 · 217 阅读 · 8 评论 -
51-如何利用 CompletableFuture 实现“旅游平台”问题?
旅游平台问题什么是旅游平台问题呢?如果想要搭建一个旅游平台,经常会有这样的需求,那就是用户想同时获取多家航空公司的航班信息。比如,从北京到上海的机票钱是多少?有很多家航空公司都有这样的航班信息,所以应该把所有航空公司的航班、票价等信息都获取到,然后再聚合。由于每个航空公司都有自己的服务器,所以分别去请求它们的服务器就可以了,比如请求国航、海航、东航等,如下图所示:串行一种比较原始的方式是用串行的方式来解决这个问题。比如我们想获取价格,要先去访问国航,在这里叫作 website 1,然后再去访问海原创 2021-01-26 22:58:29 · 173 阅读 · 3 评论 -
50-使用 Future 有哪些注意点?Future 产生新的线程了吗?
Future 的注意点当 for 循环批量获取 Future 的结果时容易 block,get 方法调用时应使用 timeout 限制对于 Future 而言,第一个注意点就是,当 for 循环批量获取 Future 的结果时容易 block,在调用 get 方法时,应该使用 timeout 来限制。下面我们具体看看这是一个什么情况。首先,假设一共有四个任务需要执行,我们都把它放到线程池中,然后它获取的时候是按照从 1 到 4 的顺序,也就是执行 get() 方法来获取的,代码如下所示:pub原创 2021-01-25 23:25:52 · 303 阅读 · 0 评论 -
49-Future 的主要功能是什么?
Future 类Future 的作用Future 最主要的作用是,比如当做一定运算的时候,运算过程可能比较耗时,有时会去查数据库,或是繁重的计算,比如压缩、加密等,在这种情况下,如果我们一直在原地等待方法返回,显然是不明智的,整体程序的运行效率会大大降低。我们可以把运算的过程放到子线程去执行,再通过 Future 去控制子线程执行的计算过程,最后获取到计算结果。这样一来就可以把整个程序的运行效率提高,是一种异步的思想。Callable 和 Future 的关系接下来我们介绍下 Callable 和原创 2021-01-23 23:48:55 · 156 阅读 · 0 评论 -
48-Callable 和 Runnable 的不同?
为什么需要 Callable?Runnable 的缺陷先来看一下,为什么需要 Callable?要想回答这个问题,我们先来看看现有的 Runnable 有哪些缺陷?不能返回一个返回值第一个缺陷,对于 Runnable 而言,它不能返回一个返回值,虽然可以利用其他的一些办法,比如在 Runnable 方法中写入日志文件或者修改某个共享的对象的办法,来达到保存线程执行结果的目的,但这种解决问题的行为千曲百折,属于曲线救国,效率着实不高。实际上,在很多情况下执行一个子线程时,我们都希望能得到执行的任务的结原创 2021-01-20 21:20:02 · 121 阅读 · 3 评论 -
43-Java 8 中 Adder 和 Accumulator 有什么区别?
Adder 的介绍我们要知道 Adder 和 Accumulator 都是 Java 8 引入的,是相对比较新的类。对于 Adder 而言,比如最典型的 LongAdder,我们在第 40 次的时候已经讲解过了,在高并发下 LongAdder 比 AtomicLong 效率更高,因为对于 AtomicLong 而言,它只适合用于低并发场景,否则在高并发的场景下,由于 CAS 的冲突概率大,会导致经常自旋,影响整体效率。而 LongAdder 引入了分段锁的概念,当竞争不激烈的时候,所有线程都是通过 CA原创 2021-01-12 22:28:19 · 184 阅读 · 0 评论 -
42-AtomicInteger 和 synchronized 的异同点?
说了原子类和 synchronized 关键字都可以用来保证线程安全,本文,分别用原子类和 synchronized 关键字来解决一个经典的线程安全问题,给出具体的代码对比,然后再分析它们背后的区别。代码对比首先,原始的线程不安全的情况的代码如下所示:public class Lesson42 implements Runnable { static int value = 0; public static void main(String[] args) throws Interru原创 2021-01-11 23:10:53 · 196 阅读 · 1 评论