使用 lock 而不是声明同步函数时,更加公平地防止java中的饥饿 它无法实例化类型Lock
是否需要实现像http://tutorials.jenkov.com/java-concurrency/starvation-and-fairness.html这样的FairLock 上面的java的锁等于 FairLock ?它说 FairLock 会降低性能,实际操作会是什么
Lock lock = new Lock();
答案 0 :(得分:3)
您可能正在尝试实例化java.util.concurrent.locks.Lock,这是一个接口。那当然不行。您将要实例化一个实现,例如ReentrantLock,这是在Java中执行“灵活”锁定的标准方法,在简单的监视器锁定不足的情况下。它的文档有关于公平的说法:
此类的构造函数接受可选的fairness参数。当设置为true时,在争用下,锁定有利于授予对等待时间最长的线程的访问权限。否则,此锁定不保证任何特定的访问顺序。使用由许多线程访问的公平锁的程序可以显示比使用默认设置的程序更低的总吞吐量(即,更慢;通常慢得多),但是获得锁的时间变化较小并且保证缺乏饥饿。但请注意,锁的公平性并不能保证线程调度的公平性。因此,使用公平锁定的许多线程中的一个可以连续多次获得它,而其他活动线程没有进展并且当前没有保持锁定。另请注意,不定时的tryLock方法不符合公平性设置。即使其他线程正在等待,如果锁可用,它也会成功。