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

你可能感兴趣的文章
python基础变量之---元组
查看>>
python基础内容_Python基础入门必须了解的
查看>>
Python基础之面向对象2(封装)
查看>>
Python基础之给函数增加元信息
查看>>
python基础之字符编码
查看>>
python基础之多线程与多进程(二)
查看>>
Python基础——MySQL数据库基本操作
查看>>
Python基础_列表 list
查看>>
python基础---->常用模块
查看>>
Python基础(2):控制结构
查看>>
Python基础 | 关于“循环”那些事
查看>>
python系列【仅供参考】:python 远程rdp
查看>>
python基于flask搭建http服务(四)—— Docker容器化部署
查看>>
Python块键盘/鼠标输入
查看>>
python在使用HTMLTestRunner时,报告为空,错误提示<_io.TextIOWrapper name='<stderr>' mode='w' encoding='utf_8'>...
查看>>
python在gpu上运行_【python】python开启GPU加速
查看>>
Python在def函数中使用for循环
查看>>
Python在def函数中使用for循环
查看>>
Python在Conda环境中,但在Windows虚拟环境中没有激活
查看>>
python系列【仅供参考】:python pip 错误 ModuleNotFoundError: No module named pip._internal 解决办法
查看>>