软件定制开发按需定价,如有需要可联系客服进行咨询
软件定制开发按需定价,如有需要可联系客服进行咨询
公平锁和非公平锁
公平锁:多个线程按照申请锁的顺序来获取锁
公平锁的优点是等待锁的线程不会饿死。缺点是整体吞吐效率相对非公平锁要低,等待队列中除第一个线程以外的所有线程都会阻塞,CPU唤醒阻塞线程的开销比非公平锁大。
非公平锁:多个线程加锁时直接尝试获取锁,获取不到才会到等待队列的队尾等待。但如果此时锁刚好可用,那么这个线程可以无需阻塞直接获取到锁,所以非公平锁有可能出现后申请锁的线程先获取锁的场景。
非公平锁的优点是可以减少唤起线程的开销,整体的吞吐效率高,因为线程有几率不阻塞直接获得锁,CPU不必唤醒所有线程。缺点是处于等待队列中的线程可能会饿死,或者等很久才会获得锁。
在JAVA中,ReentrantLock可通过构造函数至指定是否是公平锁,默认是非公平锁
//********************* 公平锁加锁 *********************** protected final boolean tryAcquire(int acquires) { final Thread current = Thread.currentThread(); int c = getState(); if (c == 0) { if (!hasQueuedPredecessors() && //区别在这,!hasQueuedPredecessors() compareAndSetState(0, acquires)) { setExclusiveOwnerThread(current); return true; } } else if (current == getExclusiveOwnerThread()) { int nextc = c + acquires; if (nextc < 0) throw new Error("Maximum lock count exceeded"); setState(nextc); return true; } return false; } //********************* 非公平锁加锁 *********************** final boolean nonfairTryAcquire(int acquires) { final Thread current = Thread.currentThread(); int c = getState(); if (c == 0) { if (compareAndSetState(0, acquires)) { setExclusiveOwnerThread(current); return true; } } else if (current == getExclusiveOwnerThread()) { int nextc = c + acquires; if (nextc < 0) // overflow throw new Error("Maximum lock count exceeded"); setState(nextc); return true; } return false; }
通过上面的源代码对比,可以明显的看出公平锁与非公平锁的lock()方法唯一的区别就在于公平锁在获取同步状态时多了一个限制条件:hasQueuedPredecessors()。这个方法主要是判断当前线程是否位于同步队列中的第一个。如果是则返回true,否则返回false。也就是说公平锁按照队列等待顺序来加锁的
public final boolean hasQueuedPredecessors() { Node t = tail; // Read fields in reverse initialization order Node h = head; Node s; return h != t && ((s = h.next) == null || s.thread != Thread.currentThread()); }
synchronized默认是非公平锁并且不能变为公平锁
以上就是
软件定制开发按需定价,如有需要可联系客服进行咨询, 更多内容欢迎关注之后的文章
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2023-10-26 在线直播源码,Dialog使用详情(中间弹框)
2023-10-26 直播app系统源码,Flutter中导航栏和状态栏设置成透明
2023-10-26 直播系统源码,自动登录及记住密码实现
2022-10-26 直播平台源码,解决uni-app中flex布局子元素宽度溢出
2022-10-26 直播app开发搭建,纯css/html实现侧边导航栏
2022-10-26 直播系统搭建,Elasticsearch通过Http请求实现查询操作
2021-10-26 视频聊天室源码,按住对话框右滑显示删除