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方法获取该锁后,其他线程无法进入该同步块,直到持有锁的线程释放锁。
推理正确性验证
你的两段推理都是完全正确的:
- 非静态的
synchronized方法,锁的对象就是当前类的实例。当一个线程持有该实例的锁时,其他线程调用该实例的任何非静态synchronized方法都会被阻塞,必须等锁释放后才能执行。 static属性属于类级别,会被该类所有实例共享。这里的obj是final static修饰的,作为同步块的锁,保证了所有MyThread实例的线程在进入同步块时都竞争同一把锁,同一时刻只有一个线程能执行同步块内的代码,直到锁被释放。
内容的提问来源于stack exchange,提问作者wydra__
相关产品推荐
相关产品推荐

