- 内存模型的相关概念
- 并发编程中的三个概念:可见性、原子性、有序性
- Java内存模型:主内存、线程的工作内存
- 深入剖析volatile关键字:lock前缀指令——内存屏障,保证有序性,不保证原子性——无法替代synchronized
- 使用volatile关键字的场景:状态标记量、双重检测
以上参考: Java并发编程:volatile关键字解析 可以说是写的很到位了~
上文中特别需要注意的点:
- volatile关键字只能保证可见性,即保证每次读取到的值是最近的值,但不能保证对变量的操作是原子性的。volatile的语义有两个,一是保证变量可见性,二是禁止指令重排序优化,即在volatile变量前的语句,其字节码仍然在volatile之前(虽然这些字节码是有个可能进行乱序优化的),其后的语句亦然。
- 只有当这两个条件同时满足的时候,使用volatile关键字才是并发安全的:1.运算结果并不依赖变量的当前值,或者能够确保只有单一的线程可以修改变量的值。 2.变量不需要其他的状态变量共同参与不变约束。
- 线程的实现:内核线程;用户线程;用户线程加轻量级进程混合。
- Java线程的调度——为线程分配处理器使用权:协同式——容易一直阻塞导致系统崩溃、抢占式——每个线程执行时间由系统分配;线程的优先级(不靠谱);
- 线程的状态转换:新建(New)、运行(Runnable)、无限期 等待(Waiting)、限期等待(Time Waiting)、阻塞(Blocked)、终结(Terminated)。
以上参考:多线程---->Java与线程
上文中重点:
- 线程的优先级并不太靠谱,因为Java线程是通过映射到系统的原生线程来实现的,所以线程调度最终还是取决于操作系统。而操作系统所提供的线程优先级并不一定能够与Java中的线程优先级一一对应(如windows只有6个优先级,Java10个)。另外,优先级可能会被系统自行改变。因此,不能在程序中通过 线程优先级来完全准确判断一组都处于就绪状态的线程将会先执行哪一个。
- 线程的等待态和阻塞态的区别,等待态是等待一个事件或等待一段时间后将线程唤醒,而阻塞态则是等待另一个线程释放其所等待的排他锁。