新浪的博客编辑器貌似漂亮了不少,还增加了首行自动缩进
1. 公平性
创建ReentrantLock对象时,使用true参数可以激活公平锁策略(fair locking policy):
Lock fareLock = new ReentrantLock(true);
公平锁有助于等待时间最长的线程的恢复运行,当然这种机制也影响了程序性能。公平锁比普通锁慢很多,因此默认关闭。
2. 锁测试、超时
线程调用lock方法的时候很有可能停滞,可以使用tryLock()方法代替。获得锁成功,tryLock返回true,反之返回false,且线程可以继续运行。
可以在tryLock中增加时限参数,如
if (myLock.tryLock(1000, TimeUnit.MILLISECONDS) ...
表示时限为1000毫秒,TimeUnit是一个枚举类,它的值有SECONDS, MILLISECONDS, MICROSECONDS, NANOSECONDS。
带时限参数的tryLock方法和lock方法一样遵循公平原则,但是无参的tryLock却不会,不过可以用tryLock(0, TimeOut.SECONES)代替。
lock方法无法被打断,如果一个线程在等待锁的时候被中断,它会继续处于停滞状态,知道获得锁为止。而使用带时限的tryLock方法,如果线程在等待时被中断,它会抛出InterruptedException异常。这很有用,可以防止程序锁死的发生。
类似的还有lockInterruptibly,和tryLock很相似,只是时限无限长。
Condition也可以设置时限:
myCondition.await(100, TimeUnit.MILLISECONDS);
这样await方法有三种结束的可能:其他线程调用的signal或signalAll方法激活该线程;时限到;线程被中断(抛出InterruptedException)。
对于第三种可能,如果不想被中断(一般很少这样),调用awaitUninterruptibly方法。
3. 读写锁
ReentrantReadWriteLock类用于许多线程从一个数据源读写的情况。readLock()和writeLock()返回内置的读写锁。
4. 为什么stop和suspend方法要被废弃
两个方法有一个共同点:都试图未经其他线程允许就控制它们的行为。
首先来看stop方法,这个方法结束了所有执行中的方法,包括run方法,当一个线程被停止的时候,它立即放弃了所有它锁住的对象,这会使那些对象处于非正常状态。如转帐的transferThread在取出资金后存入资金前被停止,就会产生事故。因为一个线程试图结束另一个线程的时候,它并不知道此时该行为是否安全。
然后是suspend方法,suspend方法并不会损害对象。但是当你调用suspend方法挂起一个线程时,这个线程拥有的锁也就同时被挂起了,此时如果调用suspend方法的线程试图获得那把锁,那么整个程序就会锁死:被挂起的线程需要恢复,能够恢复它的线程因为锁而停滞。
这种情况在GUI中尤为常见,例如银行用户界面有暂停和继续两个按钮,暂停按钮能够挂起所有运行中的线程,另外paintComponent方法能够画出每个帐号的图表。
假设某个线程获得了bank对象的锁,此时用户按下了暂停按钮,所有的转帐线程挂起,其中一个拥有bank的锁。由于某个原因,帐号图表需要重绘,调用了paintComponent方法,后者调用了getBalances方法,又因为无法获得bank对象的锁,程序锁死。而此时用户自然也无法按下继续按钮。
如果想安全地使用挂起功能,可以自己设计一个suspendRequested变量。
public void run()
{
while (. . .)
{
. . .
if (suspendRequested)
{
suspendLock.lock();
try { while (suspendRequested) suspendCondition.await(); }
finally { suspendLock.unlock(); }
}
}
}
public void requestSuspend() { suspendRequested = true; }
public void requestResume()
{
suspendRequested = false;
suspendLock.lock();
try { suspendCondition.signalAll(); }
finally { suspendLock.unlock(); }
}
private volatile boolean suspendRequested = false;
private Lock suspendLock = new ReentrantLock();
private Condition suspendCondition = suspendLock.newCondition();

posts - 403, comments - 310, trackbacks - 0, articles - 7
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

3.2 Java notes - Synchronization

Posted on 2007-04-22 20:25 ZelluX 阅读(275) 评论(0)  编辑  收藏 所属分类: OOP
2007-03-02 16:24:28
只有注册用户登录后才能发表评论。


网站导航: