线程访问同步块/代码Java

我正在阅读同步工作。 这是一个例子:

public class Singleton{ private static volatile Singleton _instance; public static Singleton getInstance(){ if(_instance == null){ synchronized(Singleton.class){ if(_instance == null) _instance = new Singleton(); } } return _instance; } 

假设两个线程AB正在访问getInstance(); 方法,如果线程Asynchronized块中,则线程B将跳过该块并执行下一个块/语句或将等待/阻塞,直到线程A离开synchronized块。

2什么是,为什么Singleton.classsynchronized参数中以及何时可以为null

以下Statement是真的吗?

内部锁在对象上:

 class A { public synchronized void method1(){...} public synchronized void method2(){...} } 

如果线程A在method1threadB无法进入method2或任何其他同步方法。

1:线程B将等待,直到线程A将释放同步对象上的锁并执行代码,之后它将获取同步对象上的锁。

2: Singleton.class是表示该类的对象。 您正在同步它,因为您的_instance -object为null。

 public synchronized void method1(){...} 

正在同步对象,你调用该方法,这意味着,如果你这样调用它,2个线程将相互等待:

 final A a = new A(); new Thread(new Runnable(){ public void run(){ a.method1(); } }).start(); a.method1(); 

但如果你在不同的对象上调用它们,两个线程将并行执行:

 A a = new A(); final A b = new A(); new Thread(new Runnable(){ public void run(){ b.method1(); } }).start(); a.method1(); 

最后一个问题:对,线程B不会进入方法2,因为synchronized方法锁定了Object

顺便说一句。

 public synchronized void method1(){...} 

相当于:

 public void method1(){ synchronized(this){ ... } } 

有关synchronized关键字的文档,请参见此处 。

在方法上使用synchronized将一次只允许一个线程访问该方法。 所有其他线程将阻塞并排队等待执行。 使用此关键字时,实例对象将用作锁定以同步执行。 如果在同一对象上调用方法,则一次只能有一个线程持有锁,因此您的语句为true。

在方法上使用synchronized关键字可能会降低性能,建议使用Java并发API,请参阅此处 。