JMM和synchronize的一些记录:

来源:互联网 发布:minecraft java版 编辑:程序博客网 时间:2024/04/30 22:43


内存模型:可以理解为在特定的操作协议下,对特定的内存或高速缓存进行读写访问的过程抽象。

Java内存模型:JMM决定一个线程对共享变量的写入何时对另一个线程可见,从抽象的角度来上看,JMM定义了线程和主内存之间的抽象关系。线程之间的共享变量存储在主内存中,每个线程都有一个私有的本地内存,保存了该线程使用到的共享变量副本,本地内存是一个抽象的概念,并不是真实存在。

Happens-before:先行发生原则是JMM种最核心的概念,它阐述了两个操作之间内存的可见性。假设A先行发生于B,那么操作A产生的影操作结果能别B观察到,但没有意味着A一定要在B之前发生。

先行发生原则具体:程序次序规则、管程锁定规则、volatile规则、线程启动规则、线程终止规则、线程中断规则、对象终结规则、传递性

Synchronize的底层实现:synchronized关键字被javac编译成字节码的时候,会在同步块的入口位置和退出位置分别插入monitorenter和monitorexit字节码指令,这两个字节码都需要为其指定一个锁对象,当线程执行到monitorenter指令时将会尝试获取对象对应的moniter所有权。如果该对象没被锁定或是该线程已经拥有的该对象的锁,将锁的计数器加1,当计数器为0是锁被释放,同样,当执行monitorexit指令时,把锁的计数器减1.

Synchronize的语义:当线程释放锁时,JMM会把该线程的本地内存中的共享变量刷新到主内存中;当线程获得锁时,JMM会把线程对应的本地内存的置为无效,从而是被监视器保护的代码须从住内存中读取共享变量的值。

1 0