【问题标题】:What is the Synchronization context In JavaJava中的同步上下文是什么
【发布时间】:2011-07-26 20:40:05
【问题描述】:

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

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

我需要问一下;当我写

Dimension d = new Dimension();

synchronized(d){
  // critical atomic operation
}

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

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

能否请您提供有关同步上下文的更多详细信息。

我们将不胜感激。

【问题讨论】:

    标签: java synchronization


    【解决方案1】:

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

    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
        }
    }
    

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

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

    【讨论】:

    • 好,让我们关注第三种锁,哪些方法会被锁在锁对象中。静态方法或实例同步(方法或块)或两者兼而有之?在我的第一印象中,实例同步将是正确的答案。
    • 我觉得你有点困惑 Mohammed,lock 对象本身没有被锁定。该对象用作互斥锁以同步{...} 中的部分。使用锁对象,而不是隐式同步(上面的 A. 和 B.),可以让我们进行更细粒度的控制。例如,读者可能都拥有一种锁,而作者拥有另一种锁等等。
    • 在Java中,同步是通过锁定一个对象来实现的。那么以下哪个对象被锁定在 C 中?确定不是这个实例,也不是 X.class,但答案将是 C 选项中的“锁定”对象本身。根据您的互斥体文档,有一个公共资源,并且该资源必须是安全的,不能同时访问。请纠正我。
    • 对象上的锁是由JVM完成的,但是你说的是对象锁的用途。你不谈论同步机制。 Java 证书在 SCJP 的目标 4.3 中谈到了这一点。
    【解决方案2】:

    将同步关键字应用于非静态方法是以下的简写:

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

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

    【讨论】:

    • 我不这么认为,要锁定静态方法,您需要锁定由 synchronized(X.class) 加载的类的 java.lang.Class 实例。 synchronized(this) 将锁定实例中的同步块。
    • 对不起@Mohammed Amr,你是对的,我也知道,只是在我打字的时候被匆匆忙忙去做别的事情。已更正。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多