http://my.oschina.net/clopopo/blog/140479
public
class
TASLock {
private
AtomicBoolean state =
new
AtomicBoolean(
false
);
public
void
lock() {
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时都会产生缓存缺失,都会从主存中去重新加载,这会导致一阵的总线风暴。