Java 同步块

Java 同步块,java,synchronized,Java,Synchronized,我是线程的新手,特别是synchronized关键字 我知道,如果一个线程试图访问另一个线程已经拥有锁的同步块,那么该线程的状态将更改为BLOCKED 供参考: synchronized (objA){ objA.methodA(); } //some code objA.methodB(); 我的问题是另一个线程是否可以通过另一个独立的方法(methodB())更改对象objA。或者拥有锁是否意味着没有其他线程可以以任何方式访问/更改objA,即更改代码是否在同步块中?否。拥有监

我是线程的新手,特别是
synchronized
关键字

我知道,如果一个线程试图访问另一个线程已经拥有锁的同步块,那么该线程的状态将更改为
BLOCKED

供参考:

synchronized (objA){
    objA.methodA();
}

//some code

objA.methodB();

我的问题是另一个线程是否可以通过另一个独立的方法(
methodB()
)更改对象
objA
。或者拥有锁是否意味着没有其他线程可以以任何方式访问/更改
objA
,即更改代码是否在同步块中?

否。拥有监视器(锁)的唯一含义是,在您放弃它之前,没有其他线程也可以拥有它

当然,这意味着他们不能在objA上调用任何
synchronized
方法(因为这需要获取锁),因此如果objA上的所有修改方法都是同步的(或者使用
synchronized(this){…}
块),那么“否”就变成了“是”


但是,如果
methodB
从未尝试锁定
(通过同步或使用同步块),那么对
objA
的任何锁定都不会阻止调用
objA.methodB()

否。拥有监视器(锁定)意味着,除非您放弃它,否则没有其他线程也可以拥有它

当然,这意味着他们不能在objA上调用任何
synchronized
方法(因为这需要获取锁),因此如果objA上的所有修改方法都是同步的(或者使用
synchronized(this){…}
块),那么“否”就变成了“是”


但是,如果
methodB
从未尝试锁定
(通过同步,或通过使用同步块),那么对
objA
的任何锁定都不会阻止调用
objA.methodB()
在对象上同步将锁定对象的监视器。
这意味着,如果线程已经在同一对象上的同步语句(或同步方法)中执行,则无法在该对象上执行同步方法或同步语句。

但对于没有同步的方法,情况就不同了。

实际上,当线程在同一个
objA
上的同步语句中执行时,任何线程都可以调用
objA
上的任何非同步方法。

在对象上同步会锁定对象的监视器。
这意味着,如果线程已经在同一对象上的同步语句(或同步方法)中执行,则无法在该对象上执行同步方法或同步语句。

但对于没有同步的方法,情况就不同了。

实际上,当线程在同一
objA
上的synchronized语句中执行时,任何线程都可以调用
objA
上的任何非同步方法。请注意,正确同步的对象还需要同步读取由同步块保护的状态的方法。仅同步“修改方法”是不够的。@JBNizet很好!例外情况是,如果该状态在
volatile
字段中,但这是一个更高级的主题。请注意,正确同步的对象还需要同步读取由同步块保护的状态的方法。仅同步“修改方法”是不够的。@JBNizet很好!例外情况是,如果该状态在
volatile
字段中,但这是一个更高级的主题。那么,当另一个线程拥有监视器时,是否可能在
objA
上调用未同步的方法?是的。任何线程都可以随时调用非同步方法,因为它不需要持有任何锁来调用它。那么,当另一个线程拥有监视器时,是否可能在
objA
上调用未同步的方法?是的。任何线程都可以随时调用非同步方法,因为它不需要持有任何锁来调用它。