博客
关于我
深入理解synchronized实现原理
阅读量:568 次
发布时间:2019-03-09

本文共 1273 字,大约阅读时间需要 4 分钟。

Java Synchronized锁实现原理详解

Java中的synchronized关键字是实现线程安全的重要工具,常用于保护共享资源和确保方法或代码块的互斥执行。本文将深入探讨synchronized的实现原理。

简介

synchronized关键字不仅用于保证方法或代码块在运行时同一时刻只有一个线程能够进入临界区,还能确保共享变量的内存可见性。这使得synchronized成为Java中实现线程安全的核心机制之一。

实现原理

synchronized关键字可以作用于方法和代码块,具体实现方式有所不同。

代码块的实现

代码块使用monitorenter和monitorexit指令来实现同步。每个对象都与一个monitor关联,当且仅当拥有该monitor时,才能进入临界区。具体来说:

  • 线程执行monitorenter指令时,会尝试获取对应的monitor。
  • monitor维护一个计数器,当线程获得monitor后,计数器会被设置为1。
  • 当其他线程尝试获取该monitor时,会因为计数器不为0而被阻塞,直到计数器归零后才能成功获取。
方法的实现

方法使用ACC_SYNCHRONIZED指令来实现同步。具体流程如下:

  • 线程首先需要获取monitor锁,才能进入方法执行。
  • 方法执行完成后,线程会自动释放monitor锁,无论方法是否正常返回还是抛出异常。

Monitor的实现机制

monitor是synchronized实现的关键机制,它通过维护每个对象的锁状态来协调线程的进入和退出。以下是monitor的主要工作原理:

  • 获取monitor的线程会进入_EntryList队列。
  • 当线程成功获取monitor后,进入_Owner区域,并将计数器设置为1。
  • 如果线程调用wait()方法,将进入_WaitSet队列,释放monitor锁,并将计数器归零。
  • 其他线程可以通过调用notify()或notifyAll()唤醒_WaitSet中的线程,从而重新获取monitor锁。
  • 当线程退出临界区时,会将monitor的owner设为null,并释放监视锁。

Object Monitor的结构

在Hotspot虚拟机中,object monitor由C++类ObjectMonitor实现。每个对象都有一个对应的monitor,通过Mark Word字段关联。Mark Word字段存储了对象的运行时数据,包括锁状态、线程ID、哈希码等信息。

小结

通过上述机制,synchronized实现了对共享资源的互斥访问和内存可见性。无论是代码块还是方法,synchronized都通过monitor机制实现加锁和解锁。理解monitor与object之间的关联,以及Mark Word的作用,是理解synchronized实现原理的关键。

总结

本文详细讲解了Java中的synchronized锁实现原理,涵盖了代码块、方法、monitor机制以及object monitor的结构。如需了解重量级锁的实现细节,欢迎关注后续文章。

转载地址:http://apapz.baihongyu.com/

你可能感兴趣的文章
mysql之常见函数
查看>>
Mysql之性能优化--索引的使用
查看>>
mysql之旅【第一篇】
查看>>
Mysql之索引选择及优化
查看>>
mysql之联合查询UNION
查看>>
mysql之连接查询,多表连接
查看>>
mysql乐观锁总结和实践 - 青葱岁月 - ITeye博客
查看>>
mysql也能注册到eureka_SpringCloud如何向Eureka中进行注册微服务-百度经验
查看>>
mysql乱码
查看>>
Mysql事务。开启事务、脏读、不可重复读、幻读、隔离级别
查看>>
MySQL事务与锁详解
查看>>
MySQL事务原理以及MVCC详解
查看>>
MySQL事务及其特性与锁机制
查看>>
mysql事务理解
查看>>
MySQL事务详解结合MVCC机制的理解
查看>>
MySQL事务隔离级别:读未提交、读已提交、可重复读和串行
查看>>
MySQL事务隔离级别:读未提交、读已提交、可重复读和串行
查看>>
webpack css文件处理
查看>>
mysql二进制包安装和遇到的问题
查看>>
MySql二进制日志的应用及恢復
查看>>