第十二章 Java内存模型与线程

时间:2024-04-28 12:07:24
  • Java内存模型(Java Memory Model,JMM):
    • 主内存与工作内存:Java内存模型主要是定义程序中各个变量的访问规则。Java内存模型规定了所有的变量都存储在主内存(Main Memory)中,每条线程
      还有自己的工作内存(Working Memory),线程的工作内存保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进
      行,而不能直接读写主内存中的变量。不同线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成,线程、主内存、
      工作内存关系如下:
      第十二章 Java内存模型与线程
    • 内存间交互操作:
      8种操作:
               1.lock(锁定):作用于主内存的变量,它把一个变量标识标识为一条线程独占的状态。
               2.unlock(解锁):作用于主内存的变量,它把一个处于锁定状态的变量释放出来,释放后的变量才可以被其它线程锁定。
               3.read(读取):作用于主内存的变量,它把一个变量的值从主内存传输到线程的工作内存中,以便随后的load动作使用。
               4.load(载入):作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中。
               5.use(使用):作用于工作内存的变量,它把工作内存中的一个变量的值传递给执行引擎,每当虚拟机遇到一个需要使用
                                              到变量的值的字节码指令时将会执行这个操作。
               6.assign(赋值):作用于工作内存的变量,它把一个从执行引擎接收到的值赋给工作内存的变量,每当虚拟机遇到一个给
                                                  变量赋值的字节码指令时执行这个操作。
               7.store(存储):作用于工作内存的变量,它把工作内存中的一个变量的值传送到主内存中,以便随后的write操作使用。
               8.write(写入):作用于主内存的变量,它把store操作从工作内存中得到的变量值放入主内存的变量中。
      操作规则:
              1.不允许read和load、store和write操作之一单独出现。
              2.不允许线程丢弃它最近的assign操作。
              3.不允许线程无原因地把线程的工作内存同步回主内存中。
              4.新变量只能在主内存中产生。
              5.只能有一个线程在同一时刻执行lock操作。
              6.lock时会清空工作内存中该变量副本的值。
              7.unlock必须成对出现。
              8.unlock会同步回主内存。
    • valatile:Java虚拟机最轻量级的同步机制,1.保证此变量对所有线程的可见性。2.禁止指令重排序优化。
    • 原子性、可见性、有序性。
    • 先行发生原则:1.程序次序规则(Program Order Rule) 2.管程锁定规则(Monitor Lock Rule) 3.volatile变量规则(volatile variable rule)
                                   4.线程启动规则(thread start rule) 5.线程终止规则(thread termination rule) 6.线程中断规则(thread interruption rule)
                                   7.对象终结规则(finalizer rule) 8.传递性(transitivity)
  • Java与线程:
    • 线程的实现:1.使用内核线程实现 2.使用用户线程实现 3.使用用户线程加轻量级进程混合实现
    • Java线程调度:线程调度是指系统为线程分配处理器使用权的过程,有两种:1.协同式(Cooperative) 2.抢占式(Preemptive)
    • 状态转换:java定义了5种线程状态:1.新建(New)2.运行(Runable) 3.等待(Waiting) 4.阻塞(Blocked) 5.结束(Terminated)