一个让Netty作者也感到惊讶的错误

作者: laosijikaichele | 来源:发表于2018-02-15 17:05 被阅读421次

为了表示我不是标题党,先来个截图:


一个让Netty作者也感到惊讶的错误

Netty是Java世界里网络编程框架的明星,也是我非常喜欢和推崇的开源项目之一。但其核心的Future接口实现却犯了一个基本的逻辑错误,本文就指出了Netty中的核心Future接口在实现cancel和isDone方法时违反了约定规则的问题。

首先来看java.util.concurrent.Future#cancel方法的javadoc约定:

After this method returns, subsequent calls to isDone will always return true.

就是说,在调用了cancel方法后,再调用isDone将永远返回true。

Netty的Future接口继承了Java的Future接口:

public interface Future<V> extends java.util.concurrent.Future<V>

所以在实现的时候理应遵循这一约定,但Netty截止到目前的最新版本中(4.1.21),并没有遵循这一约定,参见下面的代码例子:

import io.netty.util.concurrent.GlobalEventExecutor;

import io.netty.util.concurrent.Promise;

public class DefaultPromiseIsDoneTest {

    private final Promise defaultPromise = GlobalEventExecutor.INSTANCE.newPromise();

    public static void main(String args[]) {

        DefaultPromiseIsDoneTest main = new DefaultPromiseIsDoneTest();

        main.isDoneTest();

    }

    private void isDoneTest() {

        defaultPromise.setUncancellable();

        defaultPromise.cancel(false);

        boolean isDone = defaultPromise.isDone();

        System.out.println(isDone);

    }
}

运行后,控制台打印的是 false。 而按照约定,应该打印true才对。

Netty其它几个实现类也没有遵循这一约定:

io.netty.channel.group.VoidChannelGroupFuture#isDone
io.netty.channel.VoidChannelPromise#isDone

我在Netty的github上提出了这个问题,得到了Netty官方的确认。

https://github.com/netty/netty/issues/7712

但由于修改会导致当前版本用户受到影响,所以Netty准备在下一个大版本中修复这一问题。

我们在异步编程,实现Future接口的时候,对cancel和isDone方法的理解很可能会依赖于直觉,而没有严格对照接口文档中约定的逻辑来实现。甚至像Netty这样的老司机也犯了大意的错误。特写出这篇文章,跟大家共勉。

具体的讨论可以参见我的stackoverflow帖子(本文开头的图片就截自下面的帖子):

does-netty-violate-the-contract-of-future-cancel-method

相关文章

  • 一个让Netty作者也感到惊讶的错误

    为了表示我不是标题党,先来个截图: Netty是Java世界里网络编程框架的明星,也是我非常喜欢和推崇的开源项目之...

  • 美团架构师熬夜整理:Netty权威指南2.0版+英雄传说项目

    Netty 什么?你现在会觉得使用Netty编程的难度和工作量大了吗?Netty是一个令人惊讶的项目,在短短几年内...

  • 简书创作者

    惊讶?? 其实简书创作者是我上个月申请的,前后申请了三次吧。今天突然看到昨天通过了申请,真的既感到惊讶也感到欣慰。...

  • 使用redisson出现NoSuchMethodExceptio

    错误日志 还有一个NoSuchMethodException io.netty.bootstrap.resol...

  • Idea查看jar包冲突

    下午的时候发现项目中netty服务启动不了,debug发现是classNofound错误,但是netty服务近期都...

  • DAY 54《如何从错误中学习》

    DAY 54《如何从错误中学习》 作者与大家分享了她从教学中学到的3个令人惊讶的事情, 包括一个从错误中学习的关键...

  • 20170513 印证体会

    今天开始读《活出生命的意义》这本书,书中第9页作者 {维克多.弗兰克尔 } 写到: 让我惊讶而又感到非同寻常的是,...

  • 夭折的孩子

    昨天是我进入简书一百天的日子。我为自己能在简书这大观园里待这么长时间感到惊讶,感到兴奋,同时也感到愧疚;惊讶的是:...

  • 我想和你有个家

    女孩只身从北方来到南方,陌生的城市,没有一个可亲的人,女孩的坚强有时让自己也感到惊讶。看惯了大多都市物质化的爱情,...

  • 她们说这样的话,让我感到惊讶了!

    他们每个人拿好了装有准考证的考试袋,坐在大巴车上。在点好名后,车辆正常启动。送考的我,坐在最前排,通过车载后视镜瞄...

网友评论

    本文标题:一个让Netty作者也感到惊讶的错误

    本文链接:https://www.haomeiwen.com/subject/xnlutftx.html