synchronized 是 Java 中用于实现线程同步的关键字,它提供了互斥访问的机制,确保同一时刻只有一个线程可以执行特定的代码块或方法。synchronized 可以用于以下几种场景:
synchronized 的底层实现依赖于 JVM 的监视器锁(Monitor)机制。每个 Java 对象都与一个监视器相关联,线程可以通过获取这个监视器来实现对对象的独占访问。以下是 synchronized 在 JDK 中的实现原理:
在 JVM 中,每个对象由三部分组成:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。对象头包含了两部分信息:
Mark Word 在不同锁状态下会存储不同的内容,例如无锁状态、偏向锁、轻量级锁和重量级锁。
Java 6 之后,synchronized 的锁状态会随着竞争情况从低到高逐步升级,这个过程是不可逆的:
当锁升级到重量级锁时,JVM 会使用操作系统的互斥量(mutex)来实现同步,这时对象头中的 Mark Word 会指向一个监视器对象(Monitor)。监视器的主要结构包括:
wait() 方法后进入等待状态的线程队列。线程进入 synchronized 块时,尝试获取对象的 Monitor 锁。锁被持有后,其他线程无法进入被锁定的代码块。当线程退出同步块或方法时,锁会被释放,其他线程可以继续竞争锁。
自 JDK 1.6 起,synchronized 进行了多项优化,以提高性能:
通过这些优化措施,synchronized 在不同的竞争场景中更加高效,同时保持了代码的简洁性和易用性。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。