博客
关于我
深入理解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/

你可能感兴趣的文章
Plotly (Python) 子图:填充构面和共享图例
查看>>
pm2通过配置文件部署nodejs代码到服务器
查看>>
PML调用PDMS内核命令研究
查看>>
PMM安装-第一篇
查看>>
PMP知识要点(第九章)
查看>>
PNETLab 镜像包官方下载太慢?不急,最新版本PNET_4.2.10分享!
查看>>
POCO库中文编程参考指南(4)Poco::Net::IPAddress
查看>>
Quartz基本使用(二)
查看>>
POC项目安装与使用指南
查看>>
Podman核心技术详解
查看>>
pods 终端安装 第三方框架的一些命令
查看>>
Podzielno
查看>>
PoE、PoE+、PoE++ 三款交换机如何选择?一文带你了解
查看>>
PoE三种标准:标准 PoE、PoE+、PoE++,网络工程师必知!
查看>>
POI 的使用
查看>>
poi 读取单元格为null者空字符串
查看>>
poi-tl简介与文本/表格和图片渲染
查看>>
pointnet分割自己的点云数据_PointNet解析
查看>>
POI实现Excel导入Cannot get a text value from a numeric cell
查看>>
POI实现Excel导入时提示NoSuchMethodError: org.apache.poi.util.POILogger.log
查看>>