2012-03-11 57 views

回答

4

您可以用java.util.concurrent.locks.ReentrantLock类替换​​块。这个类提供了非常相似的互斥功能,但它也有方法tryLock,如果它是空闲的,它会获得锁,或者如果它被采用,则立即返回false。

所以,你可以有这样的:

// thread 1 has normal synchronized behavior 
rlock.lock(); 
// code 
rlock.unlock(); 

和线程2:

// thread 2 will skip the code if the lock is already taken 
if(rlock.tryLock()) { 
    // code 
    rlock.unlock(); 
} 

private final ReentrantLock rlock = new ReentrantLock(); 

码线1

2

它可以用警卫对象完成。警卫对象具有这样的功能:

  1. 锁定警戒对象。

  2. 检查是否设置了警戒标志。如果是这样,返回false,解锁守卫对象。

  3. 设置防护标志。

  4. 返回true,解锁警卫对象。

如果主叫方得到true,它知道它可以在不与任何其他线程冲突的,因为只有一个线程可以直到它被重新设置为falsefalse保护标志设置为true受保护对象进行操作,并其他线程只有在设置了防护标志时才访问该对象。

完成后,再锁定在保护对象并清除保护标记,以允许在其他线程。

防护对象的锁定可以,当然,是通过使用同步功能隐式的。通常你不会创建一个只是为了防范的对象,而是折叠与为什么需要将对象保护到守卫对象中相关的其他功能。