并发截图版2

在这里插入图片描述
在这里插入图片描述
先找L1缓存,再找L2缓存,再找L3缓存。
在这里插入图片描述
在这里插入图片描述
缓存是按块来读的。缓存块的大小叫做缓存行,固定大小64字节。
在这里插入图片描述
在这里插入图片描述
缓存一致性:缓存行在其他核更新时,本缓存如何更新?
在这里插入图片描述
缓存行的4中状态。英特尔CPU使用MESI缓存一致性协议。

在这里插入图片描述
在这里插入图片描述
花3s时间。
对比:
在这里插入图片描述
在这里插入图片描述
只花了1.2s。
在这里插入图片描述
说明:两个值非常近时,多线程访问速度可能低。
在这里插入图片描述
加入填充后,x不可能与其他变量在同一个缓存行。因此改变时不需要通知其他缓存行。

有的源码如下:
在这里插入图片描述
添加了无效字段的填充。


volatile:1.线程可见性
2.禁止重排序。


cpu速度是内存的100倍。


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
原因是CPU会乱序执行。


DCL单例要不要加volatile。

在这里插入图片描述
在这里插入图片描述
DCL:Double Check Lock

这个单例还挺不错的。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
经典的DCL写法。以下写法是完美的。很多代码都会用。
在这里插入图片描述
先判断的时间非常短,比直接上锁快很多。
在这里插入图片描述
注意上边有一个volatile,必须加!!!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
读读;写写;读写;写读;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
1.Runnable线程没有返回值。
2.Callable有返回值,返回值是Future。Future拿到结果需要阻塞。
3.Google的包:ListenableFuture。这个可以完美解决。
4.jdk1.8学习ListenableFuture,诞生了CompleteFuture,比ListenableFuture更叼。

在这里插入图片描述
在这里插入图片描述
中断时需要cancel方法。

扫描二维码关注公众号,回复: 12405323 查看本文章

猜你喜欢

转载自blog.csdn.net/answer100answer/article/details/106974095