博客
关于我
深入理解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中的字符集陷阱:为何避免使用UTF-8
查看>>
mysql中的数据导入与导出
查看>>
MySQL中的时间函数
查看>>
mysql中的约束
查看>>
MySQL中的表是什么?
查看>>
mysql中穿件函数时候delimiter的用法
查看>>
Mysql中索引的分类、增删改查与存储引擎对应关系
查看>>
Mysql中索引的最左前缀原则图文剖析(全)
查看>>
MySql中给视图添加注释怎么添加_默认不支持_可以这样取巧---MySql工作笔记002
查看>>
Mysql中获取所有表名以及表名带时间字符串使用BetweenAnd筛选区间范围
查看>>
Mysql中视图的使用以及常见运算符的使用示例和优先级
查看>>
Mysql中触发器的使用示例
查看>>
Mysql中设置只允许指定ip能连接访问(可视化工具的方式)
查看>>
mysql中还有窗口函数?这是什么东西?
查看>>
mysql中间件
查看>>
MYSQL中频繁的乱码问题终极解决
查看>>
MySQL为Null会导致5个问题,个个致命!
查看>>
MySQL为什么不建议使用delete删除数据?
查看>>
MySQL主从、环境搭建、主从配制
查看>>