线程访问同步块/代码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; }
假设两个线程A
和B
正在访问getInstance();
方法,如果线程A
在synchronized
块中,则线程B
将跳过该块并执行下一个块/语句或将等待/阻塞,直到线程A
离开synchronized
块。
2什么是,为什么Singleton.class
在synchronized
参数中以及何时可以为null
以下Statement
是真的吗?
内部锁在对象上:
class A { public synchronized void method1(){...} public synchronized void method2(){...} }
如果线程A在
method1
则threadB
无法进入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,请参阅此处 。