Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的同步上下文是什么_Java_Synchronization - Fatal编程技术网

Java中的同步上下文是什么

Java中的同步上下文是什么,java,synchronization,Java,Synchronization,大家都知道Java中的同步上下文可以是 在这个例子上 在某个已加载类的java.lang.Class实例上 在给定对象上 我需要问一下;当我写作时 Dimension d = new Dimension(); synchronized(d){ // critical atomic operation } 给定对象的同步实际上等于实例上的同步 因此,当我编写synchronized(d)时,其中d是对象的实例,那么线程将获得所有同步实例代码块的锁 你能告诉我更多关于同步上下文的细节吗

大家都知道Java中的同步上下文可以是

  • 在这个例子上
  • 在某个已加载类的java.lang.Class实例上
  • 在给定对象上
我需要问一下;当我写作时

Dimension d = new Dimension();

synchronized(d){
  // critical atomic operation
}
给定对象的同步实际上等于实例上的同步

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

你能告诉我更多关于同步上下文的细节吗


感谢您的回复。

将synchronized关键字应用于非静态方法是对以下内容的简写:

public void method() {
    synchronized(this) {
        // method
    }
}

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

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

synchronized
的三个基本用途是:

A.在静态方法上:

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
}
C.在任意代码块上:

private Object lock = new Object();
void someMethod() {
    synchronized (lock) {
        // The specified object is the lock object for this block of code
    }
}
在所有情况下,一次只能有一个线程进入同步块


在所有情况下,如果同一锁定对象用于多个块,则只有一个线程可以进入任何同步块。例如,如果有另外两个线程同时调用这些方法,那么在第一个线程退出该方法之前,这些线程将一直处于阻塞状态。

我认为,要锁定静态方法,您不需要锁定synchronized(X.Class)加载的类的java.lang.Class实例。同步(这)将锁定实例中的同步块。抱歉@Mohammed Amr,你说得对,我也知道,在我键入时,我只是匆匆忙忙地去做其他事情。更正。很好,让我们关注第三种类型的锁,哪些方法将被锁定在锁对象中。静态方法或实例同步(方法或块)或两者?对于我的第一印象,实例同步将是正确的答案。我认为您有点困惑,Mohammed,没有任何东西被锁定在锁对象本身中。该对象用作互斥锁,以同步
{…}
中的部分。使用lock对象,而不是隐式同步(上面的a和B),允许我们拥有更细粒度的控制。例如,读卡器可能都有一种锁,而写卡器可能有另一种锁。在Java中,同步是通过锁定一个对象来实现的。那么下面哪个对象在C中获得锁?当然不是这个实例,也不是X.class,但答案将是C选项中的“lock”对象本身。根据互斥体文档,有一个公共资源,该资源必须是安全的,不能同时访问。请纠正我。对象的锁定是由JVM完成的,但您所说的是对象锁定的用途。你不会谈论同步机制。Java证书在SCJP的目标4.3中讨论了这一点。