多线程中 volatile 是轻量级的 synchronized,他们在多处理器开发中保证了共享变量的可见性。
可见性 的意思是 当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。
如果volatile变量修饰符使用恰当的话,他比synchronized的使用和执行成本更低,因为他不会引起线程上下文的切换和调度。
一、volatile
-
volatile 发生了什么
有volatile变量修饰的共享变量进行写操作的时候会多出一行汇编代码
xxxx Lock xxxxxx
, Lock前缀的指令在多核处理器下会引发两件事情。
1. Lock前缀指令会引起处理器缓存会写到系统内存。
2. 一个处理器的缓存会写到内存会导致其他处理器的缓存无效。
在多处理器下,为了保证各个处理器的缓存是一致的,就会实现缓存一致性协议,每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是否过期了,当处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器的缓存行设置成无效状态,当处理器对这个数据进行修改操作的时候,会重新从系统内存中把数据读到处理器缓存里。
-
volatile 优化
追加64字节能够提高并发编程的效率。
在多处理器下每个处理器都会缓存同样的头、尾节点,当一个处理器试图修改头结点时,会将整个缓存行锁定,那么在缓存一致性机制作用下,会导致其他处理器不能访问自己告诉缓存中的尾节点,而队列的入队和出队操作需要不停的修改头结点和尾节点,所以在多处理器的情况下将会严重影响到队列的入队和出队效率。追加到64字节的方式来填满高速缓冲区的缓存行,避免头结点和尾节点加载到同一个缓存行,使得头、尾节点在修改时不会相互锁定。
两种情况下不该使用追加64字节
1.缓存行非64字节宽的处理器。 2.共享变量不会被频繁的写。
因为不被频繁写一位置锁的几率也比较小,没有必要
网友评论