线程同步 - 犹豫模式
Threading synchronization - balking pattern
public class Example {
private boolean jobInProgress = false;
public void job() {
lock(this) {
if (jobInProgress) {
return;
}
jobInProgress = true;
}
// Code to execute job goes here
// ...
}
void jobCompleted() {
lock(this) {
jobInProgress = false;
}
}
}
我从维基百科获得了这段代码,但有一件事我不确定。
为什么 jobInProgress = true;
没有设置在 return 语句之后的锁定块中?更明确地说,我将尝试给出一个场景:
- 一个线程在其他线程等待时获得锁
- 它释放了锁,但在执行 jobInProgress = true; 之前,其中一个等待线程获得了锁并测试了仍然为假的条件。
这是一个可行的方案还是我没有得到正确的执行流程?
你把自己弄糊涂了:
lock(this) {
if (jobInProgress) {
return;
} // <= closing brace of if
// INSIDE LOCK, OUTSIDE IF
jobInProgress = true;
} // <= closing brace of lock
我会注意到 wiki:
public void job() {
synchronized(this) {
if (jobInProgress) {
return;
}
// INSIDE LOCK, OUTSIDE IF
jobInProgress = true;
}
// Code to execute job goes here
// ...
}
一模一样!
public class Example {
private boolean jobInProgress = false;
public void job() {
lock(this) {
if (jobInProgress) {
return;
}
jobInProgress = true;
}
// Code to execute job goes here
// ...
}
void jobCompleted() {
lock(this) {
jobInProgress = false;
}
}
}
我从维基百科获得了这段代码,但有一件事我不确定。
为什么 jobInProgress = true;
没有设置在 return 语句之后的锁定块中?更明确地说,我将尝试给出一个场景:
- 一个线程在其他线程等待时获得锁
- 它释放了锁,但在执行 jobInProgress = true; 之前,其中一个等待线程获得了锁并测试了仍然为假的条件。 这是一个可行的方案还是我没有得到正确的执行流程?
你把自己弄糊涂了:
lock(this) {
if (jobInProgress) {
return;
} // <= closing brace of if
// INSIDE LOCK, OUTSIDE IF
jobInProgress = true;
} // <= closing brace of lock
我会注意到 wiki:
public void job() {
synchronized(this) {
if (jobInProgress) {
return;
}
// INSIDE LOCK, OUTSIDE IF
jobInProgress = true;
}
// Code to execute job goes here
// ...
}
一模一样!