Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.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_Multithreading_Synchronization_Monitor - Fatal编程技术网

Java中的静态和非静态同步

Java中的静态和非静态同步,java,multithreading,synchronization,monitor,Java,Multithreading,Synchronization,Monitor,是这样说的 同步的静态方法和同步的非静态方法之间没有链接 好的,这很简单,但如果非静态方法中的代码调用静态方法呢?这个线程会同时持有静态(与类关联)和非静态(与类的实例关联)监视器吗 这个线程将同时保持静态(与类关联)和 非静态(与类的实例关联)监视器 是的,那是因为 根据, 对于类(静态) 方法的类对象关联的监视器 类被使用。对于实例方法,与 使用这个(调用方法的对象) 之后,将分别定义所有两个监控器 这个线程将同时保持静态(与类关联)和 非静态(与类的实例关联)监视器 是的,那是因为 根据,

是这样说的

同步的静态方法和同步的非静态方法之间没有链接

好的,这很简单,但如果非静态方法中的代码调用静态方法呢?这个线程会同时持有静态(与类关联)和非静态(与类的实例关联)监视器吗

这个线程将同时保持静态(与类关联)和 非静态(与类的实例关联)监视器

是的,那是因为

根据,

对于类(静态) 方法的类对象关联的监视器 类被使用。对于实例方法,与 使用这个(调用方法的对象)

之后,将分别定义所有两个监控器

这个线程将同时保持静态(与类关联)和 非静态(与类的实例关联)监视器

是的,那是因为

根据,

对于类(静态) 方法的类对象关联的监视器 类被使用。对于实例方法,与 使用这个(调用方法的对象)


之后,将分别定义所有两个监控器

没有“静态同步”或“非静态同步”之类的东西。这些想法掩盖了真正发生的事情

这:

这只是写这篇文章的捷径:

class Foobar {
    static void mumble() {
        synchronized(Foobar.class) {
            ...
        }
    }
}
class Foobar {
    void grumble() {
        synchronized(this) {
            ...
        }
    }
}
这是:

class Foobar {
    synchronized void grumble() { ... }
}
这只是写这篇文章的捷径:

class Foobar {
    static void mumble() {
        synchronized(Foobar.class) {
            ...
        }
    }
}
class Foobar {
    void grumble() {
        synchronized(this) {
            ...
        }
    }
}
谈论“静态同步”是没有意义的,因为同步是对对象所做的事情,而不存在静态对象。Java中唯一可以是
静态的
是变量和方法


另外,回答你的问题


当线程进入同步块或方法时,如果线程尚未锁定指定对象,则必须获取该对象的锁。因此,如果在我上面的示例中
f.grumble()
调用
mumble()
,那么线程首先必须在进入grumble()例程时获得
f
上的锁,然后,在仍然保持该锁的同时,它还必须获得
Foobar.class
的锁。没有任何“静态同步”或“非静态同步”。这些想法隐藏了真正发生的事情

这:

这只是写这篇文章的捷径:

class Foobar {
    static void mumble() {
        synchronized(Foobar.class) {
            ...
        }
    }
}
class Foobar {
    void grumble() {
        synchronized(this) {
            ...
        }
    }
}
这是:

class Foobar {
    synchronized void grumble() { ... }
}
这只是写这篇文章的捷径:

class Foobar {
    static void mumble() {
        synchronized(Foobar.class) {
            ...
        }
    }
}
class Foobar {
    void grumble() {
        synchronized(this) {
            ...
        }
    }
}
谈论“静态同步”是没有意义的,因为同步是对对象执行的操作,而没有静态对象。Java中唯一可以是
静态的
是变量和方法


另外,回答你的问题


当线程进入同步块或方法时,如果线程尚未锁定指定对象,则它必须获得该对象上的锁。因此,如果在我上面的示例中
f.grumble()
调用
mumble()
,那么线程在进入grumble()时必须首先获得
f
上的锁然后,在保持该锁的同时,它还必须获得
Foobar.class

的锁。一般来说,当从一个
synchronized
块输入另一个块(在另一个对象上同步)时,您必须获取两个监视器。(如果代码的另一部分试图以相反的顺序获取相同的两个监视器,砰,这就是死锁。)一般来说,当从一个
synchronized
块输入另一个时(在另一个对象上同步),您必须获取两个监视器。(如果代码的另一部分试图以相反的顺序获取相同的两个监视器,砰,这就是死锁。)你在这里。你当然应该这样说,这既是为了正确的归属,以避免剽窃指控,也是为了给你的答案增加份量,你应该对引用的文本使用引号格式。“按照Java语言规范8.4.3.6”不是引用的文本,也不应该如此格式。你在这里。你当然应该这样说,都是为了公关为了避免剽窃指控,为了给你的答案增加份量,你应该对引用的文本使用引号格式。“根据Java语言规范8.4.3.6”不是引用的文本,也不应该如此格式。