JavaGuide
JavaGuide copied to clipboard
「Java学习+面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识。准备 Java 面试,首选 JavaGuide!
“过渡使用”改为“过度使用”
https://javaguide.cn/distributed-system/theorem&algorithm&protocol/cap&base-theorem.html#cap-%E5%AE%9E%E9%99%85%E5%BA%94%E7%94%A8%E6%A1%88%E4%BE%8B `任何时刻对 ZooKeeper 的读请求都能得到一致性的结果`是错误的,这应该是一个很常见的误区,由于read 并不会触发quorum内的sync,在同一时间点不同的client views 会因为网络延迟等原因呈现不同的结果 参照 https://zookeeper.apache.org/doc/current/zookeeperInternals.html#sc_consistency `Read operations in ZooKeeper are not linearizable since they can return potentially stale data.`
参见Issue 关于Java 并发常见面试题总结(中)“如何保证变量的可见性?”问题的答案详解 #1849 
switch语句支持string类型原理:在 https://javaguide.cn/java/basis/syntactic-sugar.html#switch-%E6%94%AF%E6%8C%81-string-%E4%B8%8E%E6%9E%9A%E4%B8%BE 这一章节中,反编译后的内容看起来会有哈希冲突的问题:如果本应该执行default语句,但遇到哈希冲突,就会出现执行结果错误。https://blog.csdn.net/acingdreamer/article/details/90765150 ,这篇文章中的解释(一个switch编译后会拆分为两个switch结构)看起来更合理。 但我试过在本地编译,使用 http://www.javadecompilers.com/ 进行反编译,得到的结果是 ```java package test; public class test { public static void main(final String[] array) { final String s = "world"; switch (s) { case...
### Discussed in https://github.com/Snailclimb/JavaGuide/discussions/1659 Originally posted by **giscus[bot]** April 2, 2022 # java/collection/java-collection-questions-01 Java学习&&面试指南 https://javaguide.cn/java/collection/java-collection-questions-01.html
 
Guide哥你好,问题见下图,参考众多权威文献以及文章我认为,Java volatile关键字保证可见性是基于总线嗅探+缓存一致性协议(MESI协议),所以我认为并不是每次使用都会到主存中获取。 而MESI协议具体,我们可以从四个字母分别代表4种状态来理解: 1. Modify(修改):当缓存行中的数据被修改时,该缓存行置为M状态 2. Exclusive(独占):当只有一个缓存行使用某个数据时,置为E状态 3. Shared(共享):当其他CPU中也读取某数据到缓存行时,所有持有该数据的缓存行置为S状态 4. Invalid(无效):当某个缓存行数据修改时,其他持有该数据的缓存行置为I状态  以下图为例,我认为Java volatile变量保证可见性的原因,可以从这样一个场景理解(假设线程1在CPU1上,线程2在CPU上) CPU1读取数据a=1,CPU1的缓存中都有数据a的副本,该缓存行置为(E)独占状态 CPU2也执行读取操作,同样CPU2也有数据a=1的副本,此时总线嗅探到CPU1也有该数据,则CPU1、CPU2两个缓存行都置为(S)共享状态 CPU1修改数据a=2,CPU1的缓存以及主内存a=2,同时CPU1的缓存行置为(S)状态,总线发出通知,CPU2收到通知将缓存行置为(I)无效状态 CPU2再次读取a,虽然CPU2在缓存中命中数据a=1,但是发现状态为(I),因此直接丢弃该数据,去主内存获取最新数据  所以我认为应该改为(**答案已提交PR,劳烦Guide哥看看是否得当**): 在 Java 中,volatile 关键字底层是基于总线嗅探机制和MESI缓存一致性协议保证变量的可见性,如果我们将变量声明为 volatile ,这就指示CPU,这个变量是共享且不稳定的,每次使用它时,处理器都会判断这个变量在缓存行中的状态是否因为其他处理器的修改变成无效(Invalid),若无效则重新从系统内存中把数据读取到处理器缓存。 参考文章: 1. https://zhuanlan.zhihu.com/p/250657181 2....
MD文件中第241行的 "java.io.Writer抽象类是所有字节输出流的父类。" 更正为 “java.io.Writer抽象类是所有字符输出流的父类。”