什么是同步上下文在Java中

时间:2011-07-26 11:47:14

标签: java synchronization

所有人都知道Java中的同步上下文可以是

  • 在实例上。
  • 在某个加载类的java.lang.Class实例上。
  • 关于给定对象

我需要问;我写的时候

Dimension d = new Dimension();

synchronized(d){
  // critical atomic operation
}
实际上,

给定对象的同步等于实例上的同步。

所以当我写 synchronized(d),其中 d 是一个对象的实例时,那么该线程将获得所有同步实例代码块的锁。

您能否告诉我有关同步背景的更多详细信息。

您的回复将不胜感激。

2 个答案:

答案 0 :(得分:4)

synchronized关键字提供了对它引入的代码块(可能是整个方法)的串行访问。通过将对象用作mutex锁来完成访问的序列化。

synchronized的三个基本用途是:

一个。在静态方法上:

static synchronized void someStaticMethod() {
   // The Class object - ie "MyClass.class" - is the lock object for this block of code, which is the whole method
}

B中。在实例方法上:

synchronized void someInstanceMethod() {
   // The instance - ie "this" - is lock object for this block of code, which is the whole method
}

℃。在任意代码块上:

private Object lock = new Object();
void someMethod() {
    synchronized (lock) {
        // The specified object is the lock object for this block of code
    }
}

在所有情况下,一次只能有一个线程进入同步块。

在所有情况下,如果相同的锁对象用于多个块,则只有一个线程可以输入任何同步块。例如,如果有两个 - 其他同时线程调用方法将阻塞,直到第一个线程退出方法。

答案 1 :(得分:1)

将synchronized关键字应用于非静态方法是:

的简写
public void method() {
    synchronized(this) {
        // method
    }
}

如果将synchronized应用于静态方法,则会在调用方法时锁定类对象(MyClass.class)。