LOFTER for ipad —— 让兴趣,更有趣

点击下载 关闭
Java编程公平锁与非公平锁的用法分析
晋皖达内 2022-08-16

  锁的应用是Java编程开发程序员在开发软件的时候基本上都会用到的一个编程技术,而本文我们就通过案例分析来简单了解一下,Java编程公平锁与非公平锁的用法分析。

  公平锁:每个线程获取锁的顺序是按照线程访问锁的先后顺序获取的,前面的线程总是先获取到锁。

  非公平锁:每个线程获取锁的顺序是随机的,并不会遵循先来先得的规则,所有线程会竞争获取锁。

  通过收费站的顺序也是先来先到,分别是张三、李四、王五,这种情况就是公平锁。

  而非公平锁相当于,来了一个强行加塞的老司机,它不会准守排队规则,来了之后就会试图强行加塞,如果加塞成功就顺利通过,当然也有可能加塞失败,如果失败就乖乖去后面排队,这种情况就是非公平锁。

  在Java语言中,锁synchronized和ReentrantLock默认都是非公平锁,当然我们在创建ReentrantLock时,可以手动指定其为公平锁,但synchronized只能为非公平锁。

  公平锁执行流程

  获取锁时,先将线程自己添加到等待队列的队尾并休眠,当某线程用完锁之后,会去唤醒等待队列中队的线程尝试去获取锁,锁的使用顺序也就是队列中的先后顺序,在整个过程中,线程会从运行状态切换到休眠状态,再从休眠状态恢复成运行状态,但线程每次休眠和恢复都需要从用户态转换成内核态,而这个状态的转换是比较慢的,所以公平锁的执行速度会比较慢。

  非公平锁执行流程

  当线程获取锁时,会先通过CAS尝试获取锁,如果获取成功就直接拥有锁,如果获取锁失败才会进入等待队列,等待下次尝试获取锁。这样做的好处是,获取锁不用遵循先到先得的规则,从而避免了线程休眠和恢复的操作,这样就加速了程序的执行效率。

  优缺点分析

  公平锁的优点是按序平均分配锁资源,不会出现线程饿死的情况,它的缺点是按序唤醒线程的开销大,执行性能不高。

  非公平锁的优点是执行效率高,谁先获取到锁,锁就属于谁,不会“按资排辈”以及顺序唤醒,但缺点是资源分配随机性强,可能会出现线程饿死的情况。


推荐文章
评论(0)
分享到
转载我的主页