摘要:
一、概览 HashMap<String, Integer> map = new HashMap<>(); 这个语句执行起来,在 jdk1.8 之前,会创建一个长度是 16 的 Entry[] 数组,叫 table,用来存储键值对。 在 jdk 1.8 后,不在这里创建数组了,而是在第一次 put 的 阅读全文
摘要:
一、类文件的结构 我们都知道,各种不同平台的虚拟机,都支持 “字节码 Byte Code” 这种程序存储格式,这构成了 Java 平台无关性的基石。甚至现在平台无关性也开始演变出 “语言无关性” ,就是其他语言也可以运行在 Java 虚拟机之上,比如现在的 Kotlin、Scala 等。 实现语言无 阅读全文
摘要:
本文整理自周志明老师的《深入理解Java虚拟机-JVM高级特性与最佳实践》第3版的第二章和第三章。 加上了一些网上拼拼凑凑的图片,个人认为很多博客复制来复制去,最后的东西都看不懂,所以从书里码了一下知识点,也用作自己记忆。 一、一个命令 上面的结果显示了 jvm 的模式: Client VM(-cl 阅读全文
摘要:
Volatile 英文翻译:易变的、可变的、不稳定的。 一、volatile 定义及用法 多个线程的工作内存彼此独立,互不可见,线程启动的时候,虚拟机为每个内存分配一块工作内存,不仅包含了线程内部定义的局部变量,也包含了线程所需要使用的共享变量的副本,是为了提高效率。 在之前的示例中,线程不安全的问 阅读全文
摘要:
一、指令重排问题 你写的代码有可能,根本没有按照你期望的顺序执行,因为编译器和 CPU 会尝试指令重排来让代码运行更高效,这就是指令重排。 1.1 虚拟机层面 我们都知道CPU执行指令的时候,访问内存的速度远慢于 CPU 速度。 为了尽可能减少内存操作带来的 CPU 空置的影响,虚拟机会按照自己的一 阅读全文
摘要:
一、背景 && 定义 多线程环境下,只要有并发问题,就要保证数据的安全性,一般指的是通过 synchronized 来进行同步。 另一个问题是,多个线程之间如何协作呢? 我们看一个仓库出货问题(更具体一些,快餐店直接放好炸货的架子,不过每次只放一份) 假设仓库中只能存放一件商品,生产者将生产出来的产 阅读全文
摘要:
0、不同步的问题 并发的线程不安全问题: 多个线程同时操作同一个对象,如果控制不好,就会产生问题,叫做线程不安全。 我们来看三个比较经典的案例来说明线程不安全的问题。 0.1 订票问题 例如前面说过的黄牛订票问题,可能出现负数或相同。 线程创建方式&&黄牛订票模拟 0.2 银行取钱 再来看一个取钱的 阅读全文
摘要:
一、线程的优先级 java 提供了一个线程调度器来监控程序种启动后进入就绪状态的所有线程,线程调度器按照线程的优先级决定应该调度哪个线程来执行,优先级高的被优先调度。 优先级用数字来表示,范围从 1 到 10: Thread.MIN_ PRIORITY = 1; Thread.MAX_ PRIORI 阅读全文
摘要:
一、状态简介 一个线程的生命周期里有五大状态,分别是: 新生 就绪 运行 死亡 运行后可能遇到的阻塞状态 二、相关方法 2.1 新生状态 Thread t = new Thread(); 正如我们前面所说的,一个线程开始之后有自己的内存空间,这些工作空间和主内存进行交互,从主内存拷贝数据到工作空间。 阅读全文
摘要:
0、背景 来看一个项目需求:咖啡订购项目。 咖啡种类有很多:美式、摩卡、意大利浓咖啡; 咖啡加料:牛奶、豆浆、可可。 要求是,扩展新的咖啡种类的时候,能够方便维护,不同种类的咖啡需要快速计算多少钱,客户单点咖啡,也可以咖啡+料。 最差方案 直接想,就是一个咖啡基类,然后所有的单品、所有的组合咖啡都去 阅读全文