作者回复: 👍
作者回复: 如果key冲突比较大,hashmap还是要靠链表或者tree来解决冲突的,所以O(1)是理想值。同时增删改操作很多也影响hashmap性能。这个也是要看冲突情况。也就是说hashmap的稳定性差,如果很不幸正好偶遇它的稳定性问题,同时又接受不了,就可以尝试skiplistmap,它能保证稳定性,无论你的并发量是多大,也没有key冲突的问题。
作者回复: 👍,不止是存在竞态条件,如果在遍历的时候出现修改操作,直接抛快速失败异常
作者回复: 我觉得自己理解起来困难而且对实际工作还有用的就会讲的深入一些,反之我觉得概念或者工具跟正常思维没有冲突,就会讲的简单,甚至略过。毕竟我们只是工具的使用者,首要问题是利用这些工具解决问题。感谢你的认可,我甚至觉得写完第二篇和管程之后就可以收工了,其他所有章节不过就是帮助大家进一步理解,从不同角度理解。
作者回复: 那个跳表就跟字典的索引一样,通过这个索引既能快速定位数据,也能隔离并发(可以并发查看不同页上的字)
作者回复: 👍
作者回复: 👍
作者回复: 实际工作中,为了防止OOM,基本上都使用有界队列,我工作中也没用过LinkedTransferQueue。
作者回复: 看这几行看不出来,一般问题都能通过线程栈发现问题。我遇到过生产者和消费者共用一个线程池,生产者把线程池里的线程用光了,导致消费不了。这种情况下通过线程池不太容易看,需要去计数。不知道你的问题是不是这个。所有线程都等待,还没有死锁,就查查为什么会等待吧。
作者回复: 复制的时候允许读,可能读到数组里旧的元素。数组的引用是一致的,一旦设置就能读到,但是里面的元素会有不一致的情况
作者回复: CopyOnWriteArrayList写操作是互斥的。
作者回复: 是的,底层实现变了,我同事在1.8版本费了好大劲都没重现出来
作者回复: 1.8版本之后ConcurrentHashMap的实现改了
作者回复: 刚好有篇公众号讲到这个问题,写的非常好。https://mp.weixin.qq.com/s/yxn47A4UcsrORoDJyREEuQ
作者回复: 👍
作者回复: 读无锁,写要看具体实现
作者回复: 并发容器的遍历是线程安全的
作者回复: 原因是对的,cpu飙升不降的问题都可以用dump线程栈来分析