Fork me on GitHub

Java虚拟机---高效并发

高效并发

Java内存模型与线程

Java内存模型

目标:定义程序中各个变量(线程共享的)的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。

主内存与工作内存

  1. Java内存模型规定了所有的变量都存储在主内存中
  2. 每条线程都有自己的工作内存
  3. 线程的工作内存中保存着是被该线程使用到的变量的在主内存中的副本拷贝
  4. 线程对变量的所有操作都必须在工作内存中进行,不能直接读写主内存中的变量
  5. 不同的线程之间也无法直接访问其他线程的工作内存中的变量
  6. 线程间变量值的传递都需要通过主内存

内存之间的交互操作(原子、不可再分)

lock、unlock、read、load、use、assign、store、write

volatile变量

  1. 保证被修饰的变量对所有线程的可见性

    • 可见性:当一条线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的(普通变量需要先写到主内存中去)。(原子操作是线程安全的,非原子操作在并发情况下是不安全的)
  2. 禁止指令重排序优化

    • 变量赋值操作的顺序与程序代码中的执行顺序一致
  3. 原子性
    • 基本数据类型的访问读写(除long和double)
    • 用synchronized关键字修饰保证原子性
  4. 可见性
    -指一个线程修改了共享变量的值,其他线程能够立即得知这个修改
    • volatile、synchronize和final实现可见性
  5. 有序性
    • 在本线程中观察,所有操作有序,在一个线程观察另一个线程,所有操作都是无序的
    • volatile(禁止指令重排序)和synchronize(加锁)保证有序性

Java与线程

  1. 实现线程三种方式:使用内核线程实现、使用用户线程实现和使用用户线程加轻量级进程混合实现
  2. 线程五种状态:新建(new),运行(Runable),无限期等待(waiting),限期等待(timed waiting),阻塞(blocked)和结束(terminated)

线程安全与锁优化

Java语言中的线程安全

  1. 不可变
    • final修饰(String类,枚举类型,java.lang.Number部分子类)
  2. 绝对线程安全
  3. 相对线程安全
    • vector
    • HashTable
  4. 线程兼容
    • ArrayList
    • HashMap
  5. 线程对立

线程安全的实现方法

  1. 互斥同步(synchronize关键字,ReentrantLock重入锁)
  2. 非阻塞同步
  3. 无同步方案
    • 可重入代码
    • 线程本地存储

锁优化