线程状态

6种状态:

  • start之前是new状态


并发编程总结 - 图1

操作系统层面的划分(5种状态)

image.png

防止死锁

指令重排

  1. public class PossibleReordering {
  2. static int x = 0, y = 0;
  3. static int a = 0, b = 0;
  4. public static void main(String[] args) throws InterruptedException {
  5. Thread one = new Thread(new Runnable() {
  6. public void run() {
  7. a = 1;
  8. x = b;
  9. }
  10. });
  11. Thread other = new Thread(new Runnable() {
  12. public void run() {
  13. b = 1;
  14. y = a;
  15. }
  16. });
  17. one.start();
  18. other.start();
  19. one.join();
  20. other.join();
  21. System.out.println(“(” + x + “,” + y + “)”);
  22. }

运行结果可能为(1,0)、(0,1)或(1,1) 也可能是(0,0).

long是8字节,前后填充56,保障8字节内容不被其他内容影响
并发编程总结 - 图5

加锁不能在String Integer对象上加

Integer,String都是不可变变对象,一但对他们进行赋值就会变成新的对象,加的锁就失效了

JMM & happens-before

JMM为了防止指令重排定义了happens before关系,具体实现通过内存屏障来实现。
JMM对特殊Java语义的特殊规则支持

  • volatile
  • synchroized

image.png

  • Java虚拟机规范中定义了Java内存模型(Java Memory Model,JMM),用于屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的并发效果
  • 在JMM中,如果一个操作执行的结果需要对另一个操作可见(两个操作既可以是在一个线程之内,也可以是在不同线程之间),那么这两个操作之间必须要存在happens-before关系
  • happens-before是指令有序性的规定,是保证有序性的抽象概念,利用内存屏障技术对该规定进行实现
  • Java编译器在生成指令序列的适当位置会插入内存屏障指令来禁止特定类型的处理器重排序。

Java内存模型(JMM)总结 - 知乎