18
Jun
2015

开发问题笔记两则

1. JS 不能处理double类型的数据

这是一个相当蛋疼的问题,原因是 Javascript 里所有的数字都是使用浮点数(double)来表示的,我们知道浮点数在计算机系统中使用 “尾数(Mantissa)+指数(Exponent)” 来表示的,例如 1.2345 用浮点数的表示方式为 12345 * 10^(-4),也就是 11000000111001(12345) 11111100(-4),具体可以参见这里:https://en.wikipedia.org/wiki/Floating_point,由于Javascript中的尾数只有53位,自然不能使用全部64位来表示数字了,丢失的部分将全部填零处理,如 793548328091516928 将变为 793548328091516900

2. Netty在

Netty4Unpooled.copiedBuffer竟然不是线程安全的,在高并发情况下会污染原来的数据,其代码如下:

public static ByteBuf copiedBuffer(ByteBuffer buffer) {
        int length = buffer.remaining();
        if (length == 0) {
            return EMPTY_BUFFER;
        }
        byte[] copy = new byte[length];
        int position = buffer.position();
        try {
            buffer.get(copy);
        } finally {
            buffer.position(position);
        }
        return wrappedBuffer(copy).order(buffer.order());
}
显然如果两个线程都在做复制的话,原来buffer中的position很可能就是脏数据。我在Netty上开了一个issue:https://github.com/netty/netty/issues/3896
。如今已经被官方采纳


上一篇:二部创意曲(6级)——巴赫 下一篇:2015北京QCon大会感想

评论列表:

发表评论: