5

java并发笔记-CompletableFuture

 2 years ago
source link: https://segmentfault.com/a/1190000040957657
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

I、先行发生原则(happens-before)

1、如果一个操作happens-before另一个操作,那么第一个操作的执行结果将对第二个操作可见,而且第一个操作的执行顺序排在第二个操作之前。
2、两个操作之间存在happens-before关系,并不意味着一定要按照happens-before原则制定的顺序来执行。如果重排序之后的执行结果与按照happens-before关系来执行的结果一致,那么这种重排序并不非法。

3、8大原则:

程序次序规则:一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作;
锁定规则:一个unLock操作先行发生于后面对同一个锁lock操作;
volatile变量规则:对一个变量的写操作先行发生于后面对这个变量的读操作;
传递规则:如果操作A先行发生于操作B,而操作B又先行发生于操作C,则可以得出操作A先行发生于操作C;
线程启动规则:Thread对象的start()方法先行发生于此线程的每个一个动作;
线程中断规则:对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生;
线程终结规则:线程中所有的操作都先行发生于线程的终止检测,我们可以通过Thread.join()方法结束、Thread.isAlive()的返回值手段检测到线程已经终止执行;
对象终结规则:一个对象的初始化完成先行发生于他的finalize()方法的开始;

4、6大推理

将一个元素放入一个线程安全的队列的操作Happens-Before从队列中取出这个元素的操作;
将一个元素放入一个线程安全容器的操作Happens-Before从容器中取出这个元素的操作;
在CountDownLatch上的倒数操作Happens-Before CountDownLatch#await()操作;
释放Semaphore许可的操作Happens-Before获得许可操作;
Future表示的任务的所有操作Happens-Before Future#get()操作;
向Executor提交一个Runnable或Callable的操作Happens-Before任务开始执行操作;

II、内存可见性

如果一个线程对共享变量的修改,能够被其它线程看到,那么就能说明共享变量在线程之间是可见的。

可参照内存模型来理解

III、依据happens-before和内存可见性远离,基于CompletableFuture实现的,可编排与隔离任务的并发框架

1、架构图:

2、源码暂不开放


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK