synchronized 是否适用于 class 中的所有方法,还是仅适用于 1 个?
Does synchronized work for all methods in a class or only 1?
例如来自 class 1 的线程 1 访问子 class A 的同步方法 1。然后来自 class 2 的线程 2 从同一子 class A 访问同步方法 1。这里一切都很好.
如果我有来自class3的线程3访问子classA的同步方法2,它是否仍然禁止线程1和线程2访问方法1,而方法2正在执行它事物?如果没有,我该如何实现?
JLS, § 17.1 对此非常冗长:
A synchronized method (§8.4.3.6) automatically performs a lock action when it is invoked; its body is not executed until the lock action has successfully completed. If the method is an instance method, it locks the monitor associated with the instance for which it was invoked (that is, the object that will be known as this
during execution of the body of the method). If the method is static, it locks the monitor associated with the Class object that represents the class in which the method is defined. If execution of the method's body is ever completed, either normally or abruptly, an unlock action is automatically performed on that same monitor.
Oracle's official tutorial on synchronized Methods 语句比较好懂一点:
...
- First, it is not possible for two invocations of synchronized methods on the same object to interleave. ...
...
synchronized
方法只是编写主体为 synchronized
块的方法的快捷方式。这;
synchronized AnyType foobar(...) {
doSomething();
}
只是写这个的捷径;
AnyType foobar(...) {
synchronized(this) {
doSomething();
}
}
可以在
中找到更多详细信息
P.S.,
If I have thread 3 from class 3...
话题并非“来自 classes”。线程只是执行代码的对象。当你的程序创建一个新线程时,系统不记得也不关心创建它的方法是什么class,系统甚至不记得也不关心其他线程创建它的是什么。
你问(假设实例方法而不是静态方法):
Thread 1 ---executes--> classA.method1
Thread 2 ---executes--> classA.method1
然后
Thread 3 ---executes--> classA.method2
method1和method2都是同一个class中的同步实例方法。
结果:
method1
和 method2
都有相同的 monitor (this
实例)并且一次一个线程将获得锁并执行 method1
或 method2
并且除非执行方法的线程退出并且监视器可用于锁定,否则其他线程将无法执行此操作。
理解的关键是 monitor 对于所有两种方法 same。
例如来自 class 1 的线程 1 访问子 class A 的同步方法 1。然后来自 class 2 的线程 2 从同一子 class A 访问同步方法 1。这里一切都很好.
如果我有来自class3的线程3访问子classA的同步方法2,它是否仍然禁止线程1和线程2访问方法1,而方法2正在执行它事物?如果没有,我该如何实现?
JLS, § 17.1 对此非常冗长:
A synchronized method (§8.4.3.6) automatically performs a lock action when it is invoked; its body is not executed until the lock action has successfully completed. If the method is an instance method, it locks the monitor associated with the instance for which it was invoked (that is, the object that will be known as
this
during execution of the body of the method). If the method is static, it locks the monitor associated with the Class object that represents the class in which the method is defined. If execution of the method's body is ever completed, either normally or abruptly, an unlock action is automatically performed on that same monitor.
Oracle's official tutorial on synchronized Methods 语句比较好懂一点:
...
- First, it is not possible for two invocations of synchronized methods on the same object to interleave. ...
...
synchronized
方法只是编写主体为 synchronized
块的方法的快捷方式。这;
synchronized AnyType foobar(...) {
doSomething();
}
只是写这个的捷径;
AnyType foobar(...) {
synchronized(this) {
doSomething();
}
}
可以在
P.S.,
If I have thread 3 from class 3...
话题并非“来自 classes”。线程只是执行代码的对象。当你的程序创建一个新线程时,系统不记得也不关心创建它的方法是什么class,系统甚至不记得也不关心其他线程创建它的是什么。
你问(假设实例方法而不是静态方法):
Thread 1 ---executes--> classA.method1
Thread 2 ---executes--> classA.method1
然后
Thread 3 ---executes--> classA.method2
method1和method2都是同一个class中的同步实例方法。
结果:
method1
和 method2
都有相同的 monitor (this
实例)并且一次一个线程将获得锁并执行 method1
或 method2
并且除非执行方法的线程退出并且监视器可用于锁定,否则其他线程将无法执行此操作。
理解的关键是 monitor 对于所有两种方法 same。