V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  amiwrong123  ›  全部回复第 28 页 / 共 39 页
回复总数  779
1 ... 24  25  26  27  28  29  30  31  32  33 ... 39  
@iffi
那如果修改 AtomicIntegerArray 为 private volatile int[] array,再修改 set 函数为 public final void set(int i, int newValue) {array[i] = newValue; } 。

这样是否可以保证 可见性 呢
@hoholiday
了解了啊。要知道大部分原子类,其数据成员都是 volatile 的,其 get 方法都是直接 return 成员,而不是通过 unsafe 对象 get 。
但原子数组类,在设计上就不一样了。
2020-05-10 17:50:02 +08:00
回复了 amiwrong123 创建的主题 Java AtomicStampedReference 的 CAS 操作,这么理解对吗
@orangex
理论上版本号应该越来越大,但这里提供的函数,就是随便设置版本号。

我也感觉后者不成立。因为 current 只是一个局部变量,就算线程切出去又切回来,此时 current 就变成了一个孤儿了(只有 current 局部引用指向它),假设其他线程 趁你切出去更新了 pair 对象。此时,pair 成员一定是新的 pair 对象。此时,再通过 casPair 判断,发现 current 局部变量就不是旧引用了。
@sioncheng
看了方法签名也是一脸懵啊,我都 System.in.close()了,那 System.in 这个 InputStream 此时感觉应该处于 the end of the stream is detected 的状态啊
@pursuer
这么说,有可能是哈。我还忘说自己的环境了,win10,jdk8.也许作者跑程序不是在 Windows 上跑的。
@SoloCompany
所以我那个线程,已经产生了 IllegalMonitorStateException,但我没 catch 住呗,所以没有打印。由于有异常没 catch 住,自然我那个线程也处于死亡状态了呗
@etoah
谢谢,大概明白了。比如,我可以 Entrance 里改成 synchronized(Entrance.getClass()) {//run 里面的所有逻辑},这样就可以了。

虽说这样改变程序的本意,Entrance 代表各个大门,那自然各个大门可以同时进入人,但这样改了,即使有五个大门,同一时刻,只能有一个大门可以进人。
@etoah
谢谢回答,你这么一理,确实是对上了。
把那个语句拆分成两句确实清楚了,还有就是拆分后的第二句的执行顺序,跟第一句的不一样的原因:是不是因为,线程之间没有互斥锁,所以执行顺序就是随机的(跟线程池有关吗)?

当然,每次打印结果都可能不一样,但至少,能用你的方法对上。
@hfc
哎,所以现在我就有点没看懂这个打印结果了。。
@hfc
不是吧,我感觉只有一个 Count 对象存在吧。作为一个静态域
@Aresxue
@daozhihun
@lance6716
各位大佬,可否再帮忙解答一个问题。
就是使用这个魔数只是为了哈希相对均匀的分布,那么如果不使用这个魔数,直接让静态变量 HASH_INCREMENT 为 1,会有什么坏处吗?(是不是因为 ThreadLocalMap 用的开发寻址,所以如果哈希均匀分布,那么冲突的时候,就能大概率更快的找到冲突后的新位置吗)
@daozhihun
嗯,我现在理解到了这点了。
@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 数组成员啊。
1 ... 24  25  26  27  28  29  30  31  32  33 ... 39  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1049 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 31ms · UTC 20:16 · PVG 04:16 · LAX 12:16 · JFK 15:16
Developed with CodeLauncher
♥ Do have faith in what you're doing.