当我使用 synchronized(this.local_datamember) 时,同步在 Java 中如何工作?

How synchronization works in Java when i use synchronized(this.local_datamember)?

假设我创建了 2 个线程 CounterRunnable 并创建了一个 Mycounter 对象。

在下面的代码中,同步是如何工作的?我想象当我在计数器上同步时,它是线程中定义的一个对象 class,我现在有 2 个独立的对象和两个不同的计数器对象,每个对象有两个不同的锁。

我认为我现在锁定的是计数器对象本身,而不是单个引用对象。

public class example {

    class CounterRunnable implements Runnable {
        private MyCounter counter;

        public CounterRunnable (MyCounter counter) {
            this.counter = counter;
        }

        public void run () {
            for (int i = 0 ; i < 1000; i++)
              synchronized(this.counter){
                counter.increment();
              }
        }
    }

    class MyCounter  {
        private int c =0;
        public synchronized void increment () {
            c++;
        }
        public int value () {return c;} 
    }

    public static void main (String [] args) throws InterruptedException {

        example ex = new example();
        MyCounter counter = ex.new MyCounter();

        Thread t1 = new Thread (ex.new CounterRunnable(counter));
        Thread t2 = new Thread (ex.new CounterRunnable(counter));

        t1.start(); t2.start();
        t1.join(); t2.join();

        System.out.println(counter.value());

    }
}


您对 Object 和对象引用的工作方式感到困惑

public class Foo () {
  Object bar;

  public Foo() {
    bar = new Object();
  }
}

在上面的例子中,bar是一个对象引用。它在构造函数中分配之前为空:

bar = new Object();

bar 现在 points 到您创建的对象。当您将一个对象传递给构造函数或方法,然后将其分配给 class 中的一个对象引用时,该引用具有一个值。

回到你的同步问题。由于您将同一个对象传递给两个 CounterRunnable,因此它们在同一个对象上同步。