You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java同步方法原理及代码分析:请判断我的理解是否正确

Java同步机制代码分析与推理验证

示例1代码

public class SynchronizedCounter
 {
private int c = 0;

     public synchronized void increment() 
     {
         c++;
     }

    public synchronized void decrement() 
    {
        c--;
    }

    public synchronized int value() 
    {
        return c;
    }
}

示例2代码

public class MyThread extends Thread
 {
     private int threadId;
     private final static Object obj = new Object();

     public MyThread(int threadId)
     {
         this.threadId = threadId;
     }

     @Override
     public void run()
     {
         synchronized (obj)
         {
             for (int i = 0; i < 1000; i++)
                 System.out.println(this.threadId);
         }
    }
}

用户推理内容

  • 示例1:三个方法均为synchronized非静态方法,以类的实例对象作为锁。若创建SynchronizedCounter类的实例c1,当线程1执行increment等同步方法时,该实例的所有同步方法会被阻塞,其他线程无法同时调用这些方法。
  • 示例2:此处以final static的obj对象作为run方法内同步块的锁。由于obj是static属性,属于类本身,会被所有MyThread实例共享,是所有实例的共同监视器。当线程1执行run方法获取该锁后,其他线程无法进入该同步块,直到持有锁的线程释放锁。

推理正确性验证

你的两段推理都是完全正确的:

  1. 非静态的synchronized方法,锁的对象就是当前类的实例。当一个线程持有该实例的锁时,其他线程调用该实例的任何非静态synchronized方法都会被阻塞,必须等锁释放后才能执行。
  2. static属性属于类级别,会被该类所有实例共享。这里的obj是final static修饰的,作为同步块的锁,保证了所有MyThread实例的线程在进入同步块时都竞争同一把锁,同一时刻只有一个线程能执行同步块内的代码,直到锁被释放。

内容的提问来源于stack exchange,提问作者wydra__

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 19:42:16