多线程是面试必被问,而且问的很深的东西啊
关于原子类,也会问到。
Random中的seed是用的原子类,因此是线程安全的。但是效率不高。
来看看AtomicLong的实现
因为java的slot只有32位,而long和double是64位的,因此不是原子类
因此java中定义了AtomicLong,来实现原子的long类型。
package java.util.concurrent.atomic;
AtomicLong extends Number implements Serializable{
static final Unsafe unsafe = Unsafe.getUnsafe();
static final long valueOffset;
检查JVM是否支持lockless comparenAndSwap for longs
static final VM_SUPPORT_LONG_CAS = VMSupportCS8()这是一个native方法
static {
try{
valueOffset = unsafe.objectFieldOffset(AtomicLong.class.getDeclaredFile("value"));
}catch(Exception ex){}
}
private volatile long value;
AtomicLong(long initialValue){
value = initialValue;
}
AtomicLong(){
}
public final long get(){
return value;
}
public final void set(long newValue){
value = newValue;
}
public final void lazySet(long newValue){
unsafe.putOrderedLong(this,valueOffset,newValue);
}
public final long getAndSet(long newValue){
while(true){
long current = get();
if (compareAndSet(current,newValue))
return current;
}
}
public final boolean compareAndSet(long expect, long update){
return unsafe.compareAndSwapLong(this,valueOffset,expect,update);
}
}
// TO Be Continued