synchronize 关键字 作用 实现原理

synchronize 是解决 Java 并发问题的最常用、最简单的办法.

从线程安全的角度考虑主要作用有三个

  1. 原子性:确保线程互斥的访问同步代码块
  2. 可见性:保证共享变量的修改能及时可见,通过 JMM 模型的,当解锁的时候,将共享变量刷新到主存,线程加锁 的时候,清空工作线程的内存,从主存中重新读取变量值.(反编译可以看到在 synchronized 进入之前执行 store,即将线程内存副本同步)
  3. 有序性:解决重排序问题,即一个 unlock 先行发生于后面的对同一个锁的 lock 操作

synchronize 的实现原理

反编译得到 java 的汇编指令,synchronized 的代码块可以发现有两个关键字,monitorenter 和 monitorexit 包 围代码块.

每一个对象都是一个监视锁,当线程执行 monitorenter 时,会尝试获取监视锁的所有权,一旦线程获取到了,则 moniter 的进入数+1,同一线程再次进入的时候,进入数累加,如果其他线程进入则会阻塞,当执行 monitorexit 的时候,monitor 的进入数会-1,进入数为 0 时,释放 monitor 监控锁.

monitor 对象由对象的头部指针指向,每个 monitorObject 有几个重要属性:counter(记录重入的次数)、 EntryList(阻塞状态的线程会进入该列表)、WaitSet(处于等待的线程会加入到这个列表)

版权声明:大嘴叉子 发表于 2021-08-05 9:43:03。
转载请注明:synchronize 关键字 作用 实现原理 | 麦桃

暂无评论

暂无评论...