关键字整理


[TOC]


this / super

this 实际上是一个指向当前实例的引用对象,会在方法调用时候填充入栈帧(局部变量表。

static 方法默认采用类对象调用,所以在其中无法使用 this。

this 的使用场景有两种,一是直接使用 this 调用实例对象的方法和变量,二是用 this 调用参数不同的构造函数。


类似的还有 super,在创建一个实例对象的时候会先创建其父类的对象,super 就是指向其父类的引用对象。

同样的 super 也无法在 static 方法中使用,并且使用场景和 this 一样也有两种。

super 指向的是父类的引用,因为 Java 的单继承特性,所以 super 也不会出现指向多个的情况。

this(),super() 在构造函数中都必须放在第一行。

volatile

volatile 保证程序的可见性和有序性(无法保证原子性。

实现上 volatile 使用内存屏障( Memory Barrier),JVM 实现中定义了 LoadLoad、LoadStore,StoreLoad,StoreStore 四种内存屏障。

(可以在 OrderedAccess.hpp 中看到以上的函数声明。

在 linux_x86 实现中,因为 x86 基本能满足屏障要求所以除了 StoreLoad 其他的方法都只使用了 Complier Barrier,而 storeLoad 完整使用了 fence。

// A compiler barrier, forcing the C++ compiler to invalidate all memory assumptions
static inline void compiler_barrier() {
  // memory 会强制将 cache 和 registers 中的缓存数据作废,而必须从内存中重新获取。
  __asm__ volatile ("" : : : "memory");
}

inline void OrderAccess::loadload()   { compiler_barrier(); }
inline void OrderAccess::storestore() { compiler_barrier(); }
inline void OrderAccess::loadstore()  { compiler_barrier(); }
inline void OrderAccess::storeload()  { fence();            }

inline void OrderAccess::acquire()    { compiler_barrier(); }
inline void OrderAccess::release()    { compiler_barrier(); }

inline void OrderAccess::fence() {
   // always use locked addl since mfence is sometimes expensive
#ifdef AMD64
  __asm__ volatile ("lock; addl $0,0(%%rsp)" : : : "cc", "memory");
#else
  __asm__ volatile ("lock; addl $0,0(%%esp)" : : : "cc", "memory");
#endif
  compiler_barrier();
}

results matching ""

    No results matching ""