千家信息网

如何理解Netty的锁

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,如何理解Netty的锁,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1、分析同步问题的核心三要素原子性:"并无一气呵成,岂能无懈可击",
千家信息网最后更新 2026年11月03日如何理解Netty的锁

如何理解Netty的锁,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

1、分析同步问题的核心三要素

  • 原子性:"并无一气呵成,岂能无懈可击",如:高并发下的 i++

  • 可见性:"你做的改变,别人看不见"

  • 有序性:"不按套路出牌"

2、锁的分类

  • 竞争的态度:乐观锁(java.util.concurrent 包中的原子类) 与 悲观锁(synchronized)

  • 等待锁的人是否公平:公平锁 new ReentrantLock(true) 与 非公平锁 new ReentrantLock()

  • 是否可共享:共享锁 与 独享锁 - ReadWriteLock,其读锁是共享锁,其写锁是独享锁

3、Netty 玩转锁的五个关键点

3.1、在意锁的对象和范围 -> 减少粒度

例:初始化 channel (io.netty.bootstrap.ServerBootstrap#init)

Synchronized method -> Synchronized block

void init(Channel channel) throws Exception {        Map, Object> options = this.options0();        synchronized(options) {            setChannelOptions(channel, options, logger);        }        Map, Object> attrs = this.attrs0();        synchronized(attrs) {            Iterator var5 = attrs.entrySet().iterator();            while(true) {                if (!var5.hasNext()) {                    break;                }                Entry, Object> e = (Entry)var5.next();                AttributeKey key = (AttributeKey)e.getKey();                channel.attr(key).set(e.getValue());            }        }        //...    }

3.2、注意锁的对象本身大小 -> 减少空间占用

例:统计待发送的字节数 (io.netty.channel.ChannelOutboundBuffer)

AtomicLong -> Volatile long + AtomicLongFieldUpdater

AtomicLong vs long

前者是一个对象,包含对象头(object header)以用来保存 hashcode、lock等信息,32 位系统占用 8 字节,64 位系统占用 16 字节,所以在 64 位系统下:

  • volatile long = 8 bytes

  • AtomicLong = 8 bytes (volatile long) + 16 bytes (object header) + 8 bytes (引用) = 32 bytes

至少节约 24 字节!

结论:
Atomic* objects -> Volatile primary type + static Atomic*FieldUpdater

原子类型的对象可以用 volatile 修饰的基础类型来代替,以节省空间

3.3、注意锁的速度 -> 提高速度(提高并发性)

例1:记录内存分配字节数等功能用到的 LongCounter (io.netty.util.internal.PlatformDependent#newLongCounter())

高并发时:java.util.concurrent.atomic.AtomicLong -> java.util.concurrent.atomic.LongAdder (JDK)

结论:及时衡量,使用jdk最新功能

例2:曾经根据不同情况,选择不同的并发包实现:JDK < 1.8 考虑 ConcurrentHashMapV8(ConcurrentHashMap 在 JDK8 中的版本)

3.4、不同场景选择不同的并发类 -> 因需而变

例1:关闭和等待关闭事件执行器(Event Executor):

Object.wait/notify -> CountDownLatch

io.netty.util.concurrent.SingleThreadEventExecutor#threadLock

例2:Nio Event Loop 中负责存储 task 的 Queue

Jdk's LinkedBlockingQueue(MPMC) -> jctools' MPSC

MPMC: muti-producer & muti-consumer
MPSC: muti-producer & simple-consumer

io.netty.util.internal.PlatformDependent.Mpsc#newMpscQueue(int)

3.5、衡量好锁的价值 -> 能不用就不用

生活场景:

饭店提供了很多包厢,服务模式:

  • 一个服务员固定服务某几个包厢模式;

  • 所有服务员服务所有的包厢模式;

表面上看,前者效率没有后者高,但实际上它避免了服务员间的沟通(上下文切换)等开销,避免客人与服务员之间导出乱串,管理简单。

局部串行:Channel 的 I/O 请求处理 Pipeline 是串行的

整体并行:多个串行化线程(Nio Event Loop)

Netty 应用场景下:局部串行 + 整体并行 > 一个队列 + 多个线程模式:

  • 降低用户开发难度、逻辑简单、提升处理性能

  • 避免锁带来的上下文切换和并发保护等额外开销

看完上述内容,你们掌握如何理解Netty的锁的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

服务 字节 对象 不同 服务员 模式 包厢 原子 场景 系统 问题 上下 上下文 不用 内容 功能 多个 局部 开销 整体 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技海报 互联网科技工作委员会副主任毛军 易互联网科技有限公司 喔噻互联网科技 互联网实体化科技化 承德科技产业互联网发展 智腾互联网科技有限公司 银川新华互联网科技学校联系电话 本届互联网博览会上的黑科技 互联网新科技动漫ppt素材 世界互联网领先科技成果获奖 互联网方面的科技前沿 上海京穆互联网科技有限公司 广州有谷有贝互联网科技有限公司 信承诺互联网科技有限公司 世界互联网科技成果奖 普陀区互联网教育科技管理办法 互联网领先科技活动 银川新华互联网科技学校招聘 利用互联网等科技手段 万易互联网科技 米客互联网科技 上游互联网科技 亿人帮互联网科技 国外互联网科技网站 中国的互联网科技企业的崛起 深圳市罗太互联网科技有限公司 宇信科技在杭州互联网排第几 西安有哪些互联网高科技企业 北京天晋互联网科技有限公司
0