博客
关于我
深入理解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 INNODB引擎行锁的3种算法 Record Lock Next-Key Lock Grap Lock
查看>>
mysql InnoDB数据存储引擎 的B+树索引原理
查看>>
mysql innodb通过使用mvcc来实现可重复读
查看>>
mysql insert update 同时执行_MySQL进阶三板斧(三)看清“触发器 (Trigger)”的真实面目...
查看>>
mysql interval显示条件值_MySQL INTERVAL关键字可以使用哪些不同的单位值?
查看>>
Mysql join原理
查看>>
MySQL Join算法与调优白皮书(二)
查看>>
Mysql order by与limit混用陷阱
查看>>
Mysql order by与limit混用陷阱
查看>>
mysql order by多个字段排序
查看>>
MySQL Order By实现原理分析和Filesort优化
查看>>
mysql problems
查看>>
mysql replace first,MySQL中处理各种重复的一些方法
查看>>
MySQL replace函数替换字符串语句的用法(mysql字符串替换)
查看>>
mysql replace用法
查看>>
Mysql Row_Format 参数讲解
查看>>
mysql select, from ,join ,on ,where groupby,having ,order by limit的执行顺序和书写顺序
查看>>
MySQL Server 5.5安装记录
查看>>
mysql server has gone away
查看>>
mysql slave 停了_slave 停止。求解决方法
查看>>