当我使用 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
,因此它们在同一个对象上同步。
假设我创建了 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
,因此它们在同一个对象上同步。