http://my.oschina.net/clopopo/blog/140479
public class TASLock { private AtomicBoolean state = new AtomicBoolean(false); publicvoidlock() { while (state.getAndSet(true)) {} } public void unlock() { state.set(false); } }public class TTASLock { private AtomicBoolean state = new AtomicBoolean(false); // 加锁 public void lock() { while (true) { while (state.get()) { // 自旋 } if (!state.getAndSet(true)) { break; } } } public void unlock() { state.set(false); }}AtomicBoolean是布尔值的一个原子类型实现类。原子类型的方法是线程安全的。
TASLock :自旋测试(getandset)每次都会去设置state值,导致其他线程的本地缓存无效。每次都会产生缓存缺失。大量的缓存缺失又会导致总线资源被严重的占用(每次都得从主存中加载值)。
当然TTASLock也不是完美的加锁方案。因为TTASLock在解锁的时候,会导致其他线程本地缓存中state值无效。所有的线程再次执行get时都会产生缓存缺失,都会从主存中去重新加载,这会导致一阵的总线风暴。
浙公网安备 33010602011771号