同步块
Synchronization blocks
我是线程的新手,特别是 synchronized
关键字。
我知道如果一个线程试图访问另一个线程已经拥有锁的同步块,它的状态会变为 BLOCKED
。
供参考:
synchronized (objA){
objA.methodA();
}
//some code
objA.methodB();
我的问题是另一个线程是否可以通过另一个独立的方法(在此示例中为methodB()
)更改对象objA
。或者拥有锁是否意味着没有其他线程可以 access/alter objA
以任何方式,即更改代码是否在同步块内?
没有。拥有监视器(锁)的唯一含义是,除非您放弃它,否则其他线程也不能拥有它。
当然,这确实意味着他们不能在 objA 上调用任何 synchronized
方法(因为这需要获取锁),所以如果 objA 上的所有修改方法都是同步的(或使用 synchronized (this) {...}
块),然后 "no" 变成 "yes."
但是如果 methodB
从未尝试锁定 this
(通过同步或使用同步块),那么对 objA
的任何锁定都不会阻止调用至 objA.methodB()
.
在对象上同步会锁定对象的监视器。
这意味着如果线程已经在同一对象上的同步语句(或同步方法)中执行,则不能执行对象上的任何同步方法或同步语句。
但是没有同步方法的情况就不同了。
实际上,任何线程都可以在 objA
上调用任何非同步方法,而线程正在同一 objA
.
上执行同步语句
我是线程的新手,特别是 synchronized
关键字。
我知道如果一个线程试图访问另一个线程已经拥有锁的同步块,它的状态会变为 BLOCKED
。
供参考:
synchronized (objA){
objA.methodA();
}
//some code
objA.methodB();
我的问题是另一个线程是否可以通过另一个独立的方法(在此示例中为methodB()
)更改对象objA
。或者拥有锁是否意味着没有其他线程可以 access/alter objA
以任何方式,即更改代码是否在同步块内?
没有。拥有监视器(锁)的唯一含义是,除非您放弃它,否则其他线程也不能拥有它。
当然,这确实意味着他们不能在 objA 上调用任何 synchronized
方法(因为这需要获取锁),所以如果 objA 上的所有修改方法都是同步的(或使用 synchronized (this) {...}
块),然后 "no" 变成 "yes."
但是如果 methodB
从未尝试锁定 this
(通过同步或使用同步块),那么对 objA
的任何锁定都不会阻止调用至 objA.methodB()
.
在对象上同步会锁定对象的监视器。
这意味着如果线程已经在同一对象上的同步语句(或同步方法)中执行,则不能执行对象上的任何同步方法或同步语句。
但是没有同步方法的情况就不同了。
实际上,任何线程都可以在 objA
上调用任何非同步方法,而线程正在同一 objA
.