多线程会导致公共变量更新失败?
文中描述的问题源于多线程下公共变量channelfuture的更新不及时。在 init 方法中,channelfuture 被赋值为 bootstrap 连接的结果。但是,在 send 方法中,获取到的 channelfuture.channel() 仍然是旧的通道,导致无法正常发送消息。
解决方法:使用原子引用
为了解决这个问题,可以使用原子引用类 atomicreference 来存储 channelfuture。原子引用提供了线程安全的获取和更新操作,保证了多线程下变量的正确性。
代码示例:
private AtomicReference<ChannelFuture> channelFutureRef = new AtomicReference<>(); this.channelFutureRef.set(bootstrap.connect("127.0.0.1", 6666)); ChannelFuture channelFuture = channelFutureRef.get(); channelFuture.channel().writeAndFlush(Unpooled.copiedBuffer(msg, CharsetUtil.UTF_8));