V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  amiwrong123  ›  全部回复第 29 页 / 共 40 页
回复总数  787
1 ... 25  26  27  28  29  30  31  32  33  34 ... 40  
@lance6716 #14
你这么说,倒真是哈。。。比如让 ThreadLocal 的那个静态变量 HASH_INCREMENT 为 1 。一样实现,2 的幂里完美散列的效果。
好吧,我错了。我好像想通了。
```java
import java.util.HashSet;
import java.util.Set;

public class MagicHashCode {
private static final int HASH_INCREMENT = 0x61c88647;

public static void main(String[] args) {
hashCode1();
}


private static void hashCode1(){
Integer length = 32;
int hashCode = 0;
for(int i=0;i<length;i++){
hashCode = i*HASH_INCREMENT;//每次递增 HASH_INCREMENT
System.out.print((hashCode & (16-1)) + " ");//求散列下标,算法公式
}
}

}
```
打印结果:0 7 14 5 12 3 10 1 8 15 6 13 4 11 2 9 0 7 14 5 12 3 10 1 8 15 6 13 4 11 2 9
结论:先创建 32 个 ThreadLocal,然后给线程 A 先设置第 1 个 ThreadLocal,再设置第 17 个 ThreadLocal,然后就冲突了
@lyjr
但是,ThreadLocalMap 里面的 key,如果个数大于了阈值,就会在 rehash 啊,然后容量变成下一个 2 的幂。也就不会出现你说的这种情况了啊
@lyjr
但是见此博客 https://www.cnblogs.com/dennyzhangdd/p/7978455.html 中的 MagicHashCode 测试类,利用魔数后,就算是取模后的 i,在有限的 2 的幂的哈希表,也没有一个 i 冲突啊。
2020-04-10 19:31:47 +08:00
回复了 zxc1234 创建的主题 程序员 关于面试准备(spring 与分布式)
@chihiro2014
感觉好视频的播放量而且还这么高
2020-04-07 09:38:22 +08:00
回复了 amiwrong123 创建的主题 程序员 初学 spring,各位大佬有什么推荐的路线吗
@watzds
是指 Spring+SpringMVC+MyBatis 啦
直接 boot 会不会略过太多细节,到头来还是得学 SSM
2020-04-07 09:35:52 +08:00
回复了 amiwrong123 创建的主题 程序员 初学 spring,各位大佬有什么推荐的路线吗
@oushile
谢谢回答啦,我也决定先看看视频,但如果教程够详细的话,看博客版也不错嘛~

比较喜欢配合着书一点点学,先把书中源码下下来,然后配合书中内容把源码弄进 IDE 中,再自己尝试。还可以稍微变化书中代码进行尝试。希望看完视频可以达到这个效果吧

话说大佬有什么推荐的整合视频教程么
2020-04-05 16:32:39 +08:00
回复了 amiwrong123 创建的主题 Java switch case 配合 enum 还会生成一个匿名内部类呢?
@lanterboy
好吧,但是 java 汇编我看得有点迷。。
TrafficLight.class 部分汇编里,感觉没有那句 getstatic #4 // Field TrafficLight$1.$SwitchMap$Signal:[I 也一样啊。因为后面调用了 Signal 枚举实例的 ordinal 方法了就返回了一个 int 值了啊,感觉也没没用上那个匿名内部类的静态的 int 数组成员啊。
2020-03-30 16:55:34 +08:00
回复了 amiwrong123 创建的主题 Java 对 HashMap<Integer, String>调用 get(byte 变量) 为何取不到值?
@guyeu
java 不支持同一个位置既自动类型转换又自动装箱么,回头我试下

对,自己再写个方法可以哈。话说,你那个泛型方法 应该这样吧:

```java
static <K,V> V get(HashMap<K, V> map, K key) {
return map.get(key);
}
```
2020-03-30 14:29:45 +08:00
回复了 amiwrong123 创建的主题 Java 对 HashMap<Integer, String>调用 get(byte 变量) 为何取不到值?
@airfling
好吧,大概懂了。我主要之前以为函数签名是泛型类型呢 public V get(K key) {
2020-03-22 12:39:35 +08:00
回复了 amiwrong123 创建的主题 Java 如何理解 NIO 中 attach 以及如何正确注册 write 事件?
@az467
好吧,懂了。怪我没仔细看代码~~

所以 注册什么事件的时候,不想弄丢附件,就 sk.interestOps(sk.interestOps() | SelectionKey.OP_WRITE);呗

而想直接清空附件,就 socketChannel.register(selector, SelectionKey.OP_WRITE);呗

也不所谓哪种是正确的
2020-03-22 12:19:40 +08:00
回复了 amiwrong123 创建的主题 Java 如何理解 NIO 中 attach 以及如何正确注册 write 事件?
@az467
纳尼,这怎么说,看文档也没看出有这个意思啊。注册 读 或 写 表现还不一样昂
2020-03-22 11:59:23 +08:00
回复了 amiwrong123 创建的主题 Java 如何理解 NIO 中 attach 以及如何正确注册 write 事件?
@az467
好吧,大概懂了。等会我再去仔细看文档。
但有个地方没想通,就是第二种运行效果,为啥
```
selector 4th loop, ready event number is 1
服务端有 READ 事件就绪
lasttime readAtta is null
接下来 attach 的是:您的消息'他好吗'我已经收到了
after remove key
```
为什么经过 socketChannel.register(selector, SelectionKey.OP_READ);后(因为上一次执行了 WRITE 事件,然后在 WRITE 事件里,执行了 socketChannel.register(selector, SelectionKey.OP_READ);),下一次再执行 attachment,附件就丢了,变成 null 了呢
2020-03-21 22:10:10 +08:00
回复了 amiwrong123 创建的主题 Java NIO 中 检测到 channel 连接断开后的处理方法?
@aguesuka
非常感谢回复。

我用的服务端是这个代码 https://paste.ubuntu.com/p/hS9cQBdFyz/
发现每次都得手动停止掉服务端,来测试,还挺麻烦。。

第一种情况: 程序上呢,是每次 iterator 循环最后都 remove 掉 key 了。效果上呢,循环不断执行,每次都是 read 事件,每次 read 都抛异常。(抛异常说明对方已经断连接了,所以我也应该断连接,但我没有。所以,即使我每次 iterator 循环最后都 remove 掉 key,下一次 select 还是会选出 read 事件。 不知道我的理解对不)

第二种情况:程序上呢,是如果发现 read 抛出异常就 continue 循环,即不执行 remove key 了。效果上呢,第一次抛出异常,然后直接退出循环。(这个真没想通,为毛不 remove key,反而会导致下次 select 会直接返回 0 )

第三种情况:程序上呢,是如果发现 read 抛出异常就 continue 循环,并且 continue 之前,close channel,cancel key 。效果上呢,第一次抛出异常,然后阻塞在下一次 select 。(最后一种情况,看起来是最正常的情况,或者说,是想要的效果)

你说 SelectionKey#cancel 和 SocketChannel#close 这两个都会隐式调对方,这看源码能看出来吗。。SelectionKey#cancel 是懒汉模式的意思,只是说不会马上执行呗。

拷贝原来的 set,把原来的 set clear,然后循环被拷贝的 set 。之所以这么做,是因为 select 出来的集合 如果不显示 remove,集合永远不会删除掉元素呗。 所以不如先这样呗。
2020-03-19 10:40:08 +08:00
回复了 amiwrong123 创建的主题 Java 为什么我这么用 NIO 实现聊天室,有个 bug
@cion
对,第二个客户端不出现确实是因为你说的。

我昨天回去又试了,发现第一个客户端出现沾包的情况也不是必现的。

然后觉得 tcp 只是实现了传输,在 tcp 之上还得实现对内容协议的规定,和发送回复的流程,比如 http
2020-03-18 13:15:39 +08:00
回复了 amiwrong123 创建的主题 Java 为什么我这么用 NIO 实现聊天室,有个 bug
@jinhan13789991
@restlessdream
@cion

自己看了一遍,感觉像是,这里出错了。
client.write(charset.encode("您的昵称通过验证 "+user));
this.broadCast(welCome); //给所用用户推送上线信息,包括自己

这里的两句,好像是,时间间隔太短了。然后客户端在读取的时候,把两次的信息,都一次性读取出来了。所以客户端在收到验证后的名字时,先用空格分隔,然后第二个元素里不仅有名字,还有上线通知,所以客户端把名字和上线通知作为了自己的名字。

但是奇怪的是,为啥,第二个客户端不会发生这样的情况?
2020-03-18 11:34:57 +08:00
回复了 amiwrong123 创建的主题 Java 为什么我这么用 NIO 实现聊天室,有个 bug
@restlessdream 好吧,你说的这个,我还没有考虑,主要刚开始熟悉 NIO,合计先用比较简单的方法来实现功能。
你说的原因,我想了下。那个上线通知是服务端通知给客户端的啊,为毛之后 客户端给服务端发消息,会带有这个上线通知呢,这不是两个方向吗?有点没想通
2020-03-18 11:19:51 +08:00
回复了 amiwrong123 创建的主题 Java 为什么我这么用 NIO 实现聊天室,有个 bug
@cion 但为什么第二个运行的客户端,就肯定不会粘包啊,第三个,第四个也不会
2020-03-18 10:20:45 +08:00
回复了 amiwrong123 创建的主题 Java 为什么我这么用 NIO 实现聊天室,有个 bug
2020-03-18 09:36:19 +08:00
回复了 amiwrong123 创建的主题 Java 为什么我这么用 NIO 实现聊天室,有个 bug
@jinhan13789991
可能因为是手机上吧,等会我再发个链接出来
1 ... 25  26  27  28  29  30  31  32  33  34 ... 40  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   998 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 22ms · UTC 23:08 · PVG 07:08 · LAX 15:08 · JFK 18:08
Developed with CodeLauncher
♥ Do have faith in what you're doing.