2012-10-25 57 views

回答

3

你可能会试图实例化一个java.util.concurrent.locks.Lock,这是一个接口。这当然不会起作用。你会想实例化一个实现,比如ReentrantLock,这是在简单的监视器锁不充分的情况下做Java中“灵活”锁定的标准方式。它的文档有一些关于公平性的说法:

此类的构造函数接受可选的公平性参数。当设置为true时,在争用中,锁有利于授予对最长等待线程的访问权限。否则,该锁不保证任何特定的访问顺序。使用许多线程访问的公平锁的程序可能会比使用默认设置的整体吞吐量低(即速度较慢;通常速度较慢),但获得锁的时间差异较小,并且可以保证缺少饥饿。但请注意,锁的公平性并不能保证线程调度的公平性。因此,使用公平锁的许多线程中的一个可以连续多次获得它,而其他活动线程不在进行中并且当前没有锁。另请注意,不定时的tryLock方法不符合公平性设置。即使其他线程在等待,锁也可用。

+0

如何做到线程调度的公平性? –

+0

@Martin Lee:这是操作系统的工作。 JVM使用操作系统本机线程。除了使用一个好的操作系统并且对所有线程使用相同的优先级('Thread.setPriority(int)'),你不能做任何事情,最简单的做法就是不改变默认值。 –