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、源码暂不开放
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。