【发布时间】:2015-10-16 12:37:58
【问题描述】:
当在 Java 类中执行 Synchronized 方法时,哪个对象会被锁定?
【问题讨论】:
-
类本身(
Class<?>对象) -
投票结束作为离题,因为这个问题不是关于编程问题。即,该问题不包含 OP 编写的任何代码示例,也没有询问为什么代码未能满足 OP 的期望。
标签: java multithreading
当在 Java 类中执行 Synchronized 方法时,哪个对象会被锁定?
【问题讨论】:
Class<?> 对象)
标签: java multithreading
对于静态方法,类被锁定
class A {
static synchronized void method() {
很像,虽然不完全一样
class A {
static void method() {
synchronized(A.class) {
在这种情况下——如果一个线程已经在执行这个方法,那么没有其他线程可以调用这个方法。
对于实例方法,实例被锁定。
class A {
synchronized void method() {
和
差不多class A {
void method() {
synchronized(this) {
在这种情况下——如果有不同的实例对象被初始化,那么每个实例一个线程可以进入这个执行块。
注意:一种常见的误解是方法中有锁或方法被锁定。事实并非如此,事实上也没有标准的方法来做到这一点。
【讨论】:
synchronized 实例方法和其整个实例方法之间是否有任何实际区别body 是一个单一的synchronized(this) 声明?我所说的“实际差异”并不是指您可以通过检查字节码来判断的东西。我的意思是,您是否可以编写任何纯 Java 单元测试来揭示这两种情况之间的差异。