关于concurrency的synchronized的问题,它是如何工作的,范围是什么
Questions about the concurrency‘s synchronized, how it works, what is the scope
我想了解 java 的同步是如何工作的,我已经阅读了一些文档,但是有人可以帮助检查正确性和问题
对于代码块
public class MyWaitNotify3{
MonitorObject myMonitorObject = new MonitorObject();
boolean wasSignalled = false;
public void doWait(){
synchronized(myMonitorObject){
while(!wasSignalled){
try{
myMonitorObject.wait();
} catch(InterruptedException e){...}
}
//clear signal and continue running.
wasSignalled = false;
}
}
public void doNotify(){
synchronized(myMonitorObject){
wasSignalled = true;
myMonitorObject.notify();
}
}
}
MyWaitNotify3 inst1 = new MyWaitNotify3();
MyWaitNotify3 inst2 = new MyWaitNotify3();
如果我们用 inst1 创建一个线程,用 inst2 创建另一个线程
那么如果我们做thread1.doWait(),那么线程就会挂在“myMonitorObject.wait();”这一行
问题是“dowait”、“synchronized(myMonitorObject)”范围内的锁是否会阻止线程 2 获取“doNotify()”中的锁??
据我了解,由于是两个实例,thread2无法获取doWait中的synchronized(myMonitorObject),但会获取doNotify中的synchronized(myMonitorObject)。对吗?
如果我们定义
会发生什么
MyWaitNotify3 inst1 = new MyWaitNotify3();
thread1 = new Thread(inst1, "A");
thread2 = new Thread(inst1, "B");
The question is that the lock in scope of "dowait", "synchronized(myMonitorObject)", will this blocks thread2 from acquire the lock in "doNotify()"??
不,不会。当线程进入 wait
in doWait
的等待状态时,线程将释放关键部分(synchronized
块)的锁。那时,另一个线程可以获得 doNotify
中临界区的锁。当等待线程离开等待状态时,它必须重新获取锁。
但是,当doWait
中的线程是运行,即在wait
中没有阻塞时,它当然会持有该部分的当前锁,即myMonitorObject
,这将阻塞 doNotify
.
中的另一个线程
你可以想象wait
是一个线程离开临界区,释放锁,让其他人获得锁的点,也是线程必须进入临界区的入口点重新为其获取锁,涉及阻塞
我想了解 java 的同步是如何工作的,我已经阅读了一些文档,但是有人可以帮助检查正确性和问题 对于代码块
public class MyWaitNotify3{
MonitorObject myMonitorObject = new MonitorObject();
boolean wasSignalled = false;
public void doWait(){
synchronized(myMonitorObject){
while(!wasSignalled){
try{
myMonitorObject.wait();
} catch(InterruptedException e){...}
}
//clear signal and continue running.
wasSignalled = false;
}
}
public void doNotify(){
synchronized(myMonitorObject){
wasSignalled = true;
myMonitorObject.notify();
}
}
}
MyWaitNotify3 inst1 = new MyWaitNotify3();
MyWaitNotify3 inst2 = new MyWaitNotify3();
如果我们用 inst1 创建一个线程,用 inst2 创建另一个线程 那么如果我们做thread1.doWait(),那么线程就会挂在“myMonitorObject.wait();”这一行 问题是“dowait”、“synchronized(myMonitorObject)”范围内的锁是否会阻止线程 2 获取“doNotify()”中的锁??
据我了解,由于是两个实例,thread2无法获取doWait中的synchronized(myMonitorObject),但会获取doNotify中的synchronized(myMonitorObject)。对吗?
如果我们定义
会发生什么MyWaitNotify3 inst1 = new MyWaitNotify3();
thread1 = new Thread(inst1, "A");
thread2 = new Thread(inst1, "B");
The question is that the lock in scope of "dowait", "synchronized(myMonitorObject)", will this blocks thread2 from acquire the lock in "doNotify()"??
不,不会。当线程进入 wait
in doWait
的等待状态时,线程将释放关键部分(synchronized
块)的锁。那时,另一个线程可以获得 doNotify
中临界区的锁。当等待线程离开等待状态时,它必须重新获取锁。
但是,当doWait
中的线程是运行,即在wait
中没有阻塞时,它当然会持有该部分的当前锁,即myMonitorObject
,这将阻塞 doNotify
.
你可以想象wait
是一个线程离开临界区,释放锁,让其他人获得锁的点,也是线程必须进入临界区的入口点重新为其获取锁,涉及阻塞