synchronized锁的是什么?

1 个回答

  • 姬雪
    天越来越黑,星星会越来越亮。
    ### **`synchronized` 锁的是什么** `synchronized` 是 Java 中用于实现线程同步的关键字,它的锁机制依赖于 **对象监视器(Monitor)**,而锁的具体内容取决于 `synchronized` 的使用方式。 ### **1. 锁的是对象** 无论是同步方法还是同步代码块,`synchronized` 的最终锁定目标都是一个 **对象**,即在 Java 中,`synchronized` 是基于对象头中的 **监视器锁** 实现的。 - **普通同步方法**:锁的是当前方法所属实例对象。 - **静态同步方法**:锁的是当前方法所属的类对象(`Class` 对象)。 - **同步代码块**: - `synchronized (this)`:锁的是当前实例对象。 - `synchronized (SomeClass.class)`:锁的是类对象。 - `synchronized (object)`:锁的是指定的对象。 ### **2. 锁的对象的区别** #### **普通同步方法** ```java public synchronized void method() { // 代码 } ``` - 锁的是 **当前实例对象**,即 `this`。 - 只有调用相同实例对象方法的线程会互斥,调用不同实例对象的线程不会互相阻塞。 #### **静态同步方法** ```java public static synchronized void method() { // 代码 } ``` - 锁的是 **当前类的类对象**,即 `SomeClass.class`。 - 无论哪个线程调用这个类的静态方法,都会因为类对象的锁而互斥。 #### **同步代码块** - **锁实例对象:** ```java synchronized (this) { // 代码 } ``` 锁的是当前实例对象。 - **锁类对象:** ```java synchronized (SomeClass.class) { // 代码 } ``` 锁的是类对象。 - **锁指定对象:** ```java synchronized (someObject) { // 代码 } ``` 锁的是指定的对象 `someObject`。 ### **3. 示例代码** #### **实例方法锁** ```java public class Example { public synchronized void instanceMethod() { System.out.println(Thread.currentThread().getName() + " is running instanceMethod."); } } ``` - 两个线程调用同一个对象的 `instanceMethod` 时会互斥。 - 两个线程调用不同对象的 `instanceMethod` 时不会互斥。 #### **静态方法锁** ```java public class Example { public static synchronized void staticMethod() { System.out.println(Thread.currentThread().getName() + " is running staticMethod."); } } ``` - 所有线程共享类对象的锁,调用 `staticMethod` 时互斥。 #### **同步代码块** ```java public class Example { public void method() { synchronized (this) { System.out.println(Thread.currentThread().getName() + " is running synchronized block on this."); } } } ``` - 锁定的是 `this`,即当前实例对象。 ### **4. 锁机制的本质** `synchronized` 是基于对象头中的 **Mark Word** 和 **监视器锁(Monitor)** 实现的: - **对象头中的锁标记**: - 每个对象的对象头中包含 Mark Word,用于存储锁状态和线程持有信息。 - **Monitor**: - 锁的具体实现依赖于对象的 Monitor。 - 一个对象在成为锁时,JVM 会为其关联一个 Monitor。 ### **5. 总结** `synchronized` 的本质是锁住一个对象,无论是通过实例方法、静态方法还是代码块,都是对对象的监视器锁进行操作: - 普通方法:锁实例对象。 - 静态方法:锁类对象。 - 代码块:根据 `synchronized` 参数锁定具体对象。 锁的选择直接影响线程的同步范围和并发性能,应根据实际需求合理使用。
    发布于 2025-01-03 13:46 •IP属地 广西
    举报
    评论
    收藏1