java并发编程的核心思想就是写后读
什么是写后读?
首先我们要知道底层是怎么运行的
cpu的一个线程进行 a++;
cpu会去内存中读取,然后在高速缓存中修改,改完之后,把数据刷新回内存。
星星代表cpu t1,t2,t3代表线程 每个线程在高速缓存中都有着句柄a的内存地址。右边是内存,
2.1中提到的概念:
排他:
我这个线程操作的时候不允许其他线程操作。
内存屏障:
一块内存不让被访问就是加了屏障。比如用一个变量记录值,符合值才能操作。
缓冲行:
缓存中就是最小的组成64Byte。
原子操作:
要么都成功,要么都失败。比如第九个任务失败了,就得回滚回去重新执行。
缓存填充:
把缓存放大比如java的布尔类型设置为32位。
缓存行的内容一发生变化,就需要进行缓存同步;
所以虽然用到的不是同一个数据,但是他们(数据X和数据Y)在同一个缓存行中,缓存行的内容一发生变化,就需要进行缓存同步,这个同步是需要时间的。
避免缓存同步,把数据分开放,这样就会加快传输效率
缓存命中:
去缓存查数据的时候查到了。
写命中:
内存中a=0;cpu对a执行写操作的时候,高速缓存中有a(之前用过a),数据会在缓存中修改而不用返回内存。
写缺失:
cpu在高速缓存中写操作还没刷新回内存,其他线程操作,导致内存刷新,高速缓存中的数据内存地址失效。
比如内存中a-》b-》c 在写c的时候,b指向了d 导致c被垃圾回收 cpu在高速缓存里写c后,往内存传的时候,c没了。
violatile
作用:保证可见性。
可见性就是:保证读到的数据是正确的。(能读到别人修改之后的值)
原理:
内存数据传入高速缓存中会带着自己的地址
而当前处理器高速缓存的数据写回内存后,其他cpu的该内存的地质数据讲失效。