追加字节能优化性能

  • 这种方式看起来很神奇,单若是深刻理解处理器架构就能理解其中的奥秘。让咱们先来看看LinkedTransferQueue这个类,它使用一个内部类型来定义队列的头队列Head和尾节点tail,二这个内部类PaddedAtomicReference相对于父类AtomicReference只作了一件事情,就将共享变量共占60个字节,再加上父类的Value变量,一共64个字节。为何追加64字节可以提升并发编程的效率呢?由于对于因特尔酷睿i7,酷睿,Atom和NetBurst,Core Sole和Pentium M处理器的L1,L2和L3缓存的高速缓存行是64个字节宽,不支持部分填充缓存行,这意味着若是队列的头节点和尾节点都不足64字节的话,处理器会将他们都读到同一个高速缓存行中,在多处理器下每一个处理器都会缓存一样的头尾节点,当一个处理器试图修改头接点时会将整个缓存行锁定,那么在在缓存一致性机制的做用下,会致使其余处理器不能访问本身高速缓存中的尾节点,而队列的出队和出队操做时须要不停修改头接点和尾节点,因此在多处理器的状况下将会严重影响到队列的入队和出队效率。Doug lea使用追加到64字节的方式来填满高速缓存区的缓存行,避免头节点和尾节点加载到同一个缓存行,使得头尾节点在修改时不会互相锁定。
  • 那么是否是在使用Volatile变量时都应该追加到64字节呢?不是的,在两种情景下不该该使用这种方式。第一:缓存行非64字节宽的处理器,他们的L1和L2的高速缓存行是32个字节宽。第二:共享变量不会被频繁的写。所以使用追加字节的方式须要处理器读取更多的字节到高速缓存区,这本省就会带来必定的性能损耗,共享变量若是不被频繁写的话,锁的概率也很是的小,就不必经过追加字节的方式来避免相互锁定。
相关文章
相关标签/搜索