全国服务热线:400-6136-679

位置:洛阳达内IT教育培训机构 > 学校动态 > Java中的各种锁之公平锁与非公平锁

Java中的各种锁之公平锁与非公平锁

来源:洛阳达内IT教育培训机构时间:2021/8/18 16:13:49

  Java中的各种锁之公平锁与非公平锁
  公平锁
  l指多个线程按照申请锁的顺序获取锁,线程直接进入队列排队,队列中的个线程可以获得锁。
  l优点是等待锁的线程不会饿死。
  l缺点是整体吞吐效率低于非公平锁,等待队列中除第程外的所有线程都会被堵塞,CPU唤醒堵塞线程的费用大于非公平锁。
  非公平锁
  l指多个线程获取锁的顺序不是按照申请锁的顺序。如果得不到,会在等待队列的队尾等待。有可能申请后的线程于先申请的线程获取锁。(可能会导致级反转或饥饿。
  l优点是可以降低唤起线程的成本,整体吞吐效率高,因为线程有机会不堵塞直接锁定,CPU不需要唤醒所有线程。

  l缺点是等待队列的线程可能会饿死,或者等很久才能锁定。

Java中的各种锁之公平锁与非公平锁

  例子:
  对Java的ReentrantLock而言,通过构造函数来指定该锁是否为公平锁,默认为非公平锁。非公平锁的优点是吞吐量大于公平锁。
  根据代码,ReentrantLock中有一个内部Sync,Sync继承了AQS(AbstractQuedSynchronizer),大多数添加锁和释放锁的操作实际上都是在Sync中实现的。它有两个子类:公平锁FairSync和非公平锁NonfairSync。默认情况下,ReentrantLock使用非公平锁,或者通过构造器显示的指定使用公平锁。
  可以清楚地看到,公平锁和非公平锁的lock()方法的区别在于,公平锁在获得同步状态时有一个额外的限制:hasQueuedPredecessors()。
  进入hasQueuedPredecessors(),可以看出这种方法主要做一件事:主要是判断当前线程是否位于同步队列中的个。如果是,返回true,否则返回false。
  对Synchronized来说,这也是一不公平的锁。因为它不像ReeentrantLock是通过AQS实现线程调度的,所以没有办法把它变成公平锁。
  综上所述,公平锁是通过同步队列实现多个线程按照申请锁的顺序获取锁,从而实现公平的特性。不公平锁加锁时不考虑排队等待问题,直接尝试拿到锁,所以有申请后先拿到锁的情况。
领取试听课
每天限量名额,先到先得

尊重原创文章,转载请注明出处与链接:http://www.peixun360.com/3850/news/397505/违者必究! 以上就是洛阳达内IT教育培训机构 小编为您整理 Java中的各种锁之公平锁与非公平锁的全部内容。

温馨提示:提交留言后老师会第一时间与您联系!热线电话:400-6136-679