鱼友3172
Java后端
·2025-11-10
学习笔记 在单核时代,多个线程在一个CPU上执行,每个线程都是对一个CPU里的这个缓存进行操作,一个线程对这个缓存进行的操作,另一个线程一定是可见的,因为它们操作的是同一片缓存。 一个线程对共享变量的修改,另一个线程能立刻看到,这就是可见性。 但在多核时代,多个线程在多个CPU上执行,每个线程可能操作着不同的CPU里的缓存。CPU去修改变量时,先从内存里加载变量到寄存器里进行操作,然后写进它的缓存里,再找个时机写进内存中。每个CPU都有各自的缓存,不同的线程操作不同的缓存时,看不到另一个线程操作的缓存,这就是可见性问题。 比如说,两个线程同时执行count++的操作,线程A使用CPU-1,线程B使用CPU-2,两个线程同时在内存里加载了count=0到不同的缓存中,然后执行了+1操作,此时两个缓存中的count都是=1,如果此时再同时写进内存,那么count的值就是=1,明明加了两次。 线程A和线程B都在各自CPU的缓存里自己搞自己的,互不可见,如果线程A和线程B都各自在自己的缓存中执行一万次count++的操作,那最后得到的count的结果不是20000,而是10000-20000之间(为什么是10000-20000之间?因为两个线程中,可能有一个线程会从内存里读到的count的值是另一个线程操作了n次后返回给内存的),可是,我明明对count进行20000次的+1操作。这就是可见性问题导致的。
0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP