有c.set()新值
因为Val是引用传递,不是值传递(所以老师才把原来的Integer改成Val<Integer>)。
存的是对象,执行累加时对象的值已经改变了
可以类比之前提到的++操作,在进行add的时候,可能会出现覆盖问题,毕竟这不是个原子操作
小数值取数组是java做的缓存和引用没关系,实际没法用Integer做引用是因为Integer的值是final的,和String一样,创建后没办法改变自身的值,计算后返回的都是一个新的Integer/String
因为没重启服务,常量一直保留。
检查引入的包是不是正确。
检查有没有在idea中添加插件
idea中需要设置开启自动开启注解
另外,你的curl read 数据不正确 可能多线程并非造成的,不一定跟@Data注解有关系
这个HashSet和HashMap的多线程调用时是一样的风险,在扩容时有可能导致死循环,所以要用同步的容器或者同步代码块去调用“添加”的方法
锁发生在寄存器里是很快的,锁发生在内存里要看(如果发生在CPU的L1 cache上,就很快),如果发生在L2,L3或者内存里就慢很多;锁如果发生在IO上(比如读硬盘就非常慢)。所以缩小范围,要看缩小了什么,如果缩小了I/O,那就非常有必要了。 我用Sleep(I/O),所谓I/O就是触发中断的东西,来替代真实的I/O场景(比如读数据库,读redis等)。
寄存器速度约等于(l1),< l2, < l3 <<<<< 内存(这里大概有几十倍到百倍速度差距了) <<<<<< 固态硬盘(和内存间有百倍到千倍差距) <<<<<< 机械硬盘(和内存比大概有十万到百万倍差距)。。
initialValue起初始化作用只运行一次,每个Thread对应的Val对象的初始值确实都设为了0,没问题
连接超时,参见下面这篇文章看看
A和B同时调用了这个set方法B比A慢一点,但都是在调用这个方法
Aset值为3
Bset值为4
那么Aset的值就会就会被覆盖,为Bset的值4,最终结果就是Aset的值丢失,线程不安全