跳出同步块?
Break out of synchronized block?
我有这个:
synchronized(c){
if (!items.hasNext() && (c.getFinishedCount() == c.getStartedCount())) {
f.done(null, results);
return;
}
if(c.isBelowCapacity()){
RunMap(items,m,results,c,s,f);
}
}
但最终我不需要在调用 RunMap()
或 f.done()
时在 c 上同步,我只需要在执行条件检查/if 语句时在 c 上同步。
我应该只让 c 上的方法同步,然后去掉同步块吗?
Should I just make the methods on c synchronized, and then get rid of
the synchronized block?
不,更好的方法是在同步块中进行检查,然后再进行其余工作:
boolean bFDone = false;
boolean bRunMap = false;
synchronized (c) {
bFDone = !items.hasNext() && (c.getFinishedCount() == c.getStartedCount());
bRunMap = !bFDone && c.isBelowCapacity();
}
if (bFDone) {
f.done(null, results);
} else if (bRunMap) {
RunMap(items,m,results,c,s,f);
}
这个版本的最大优点是,所有可变代码实际上是同步的,其余(可能很慢)的东西稍后发生。
正如对此答案的评论中正确提到的那样,如果您的初始假设是正确的,即整个块不需要同步,这只会正确工作。如果您需要立即对条件做出反应,那么该块实际上需要同步(完全)。
同步 c
的方法可能不是一个好主意。首先,这意味着 无论何时 你调用它们,无论上下文如何,它们都会同步,这可能不是你的意思。其次,它无助于自动解决条件 !items.hasNext()
和 c.getFinishedCount() == c.getStartedCount()
.
一种选择是在 synchronized
块内初始化 boolean
变量,然后在它们之外执行相关调用:
final boolean isDone;
synchronized(c) {
isDone = !items.hasNext() && (c.getFinishedCount() == c.getStartedCount());
}
if (isDone) {
f.done(null, results);
return;
}
final boolean isBelowCapacity;
synchronized(c) {
isBelowCapacity = c.isBelowCapacity();
}
if (isBelowCapacity) {
RunMap(items,m,results,c,s,f);
}
我有这个:
synchronized(c){
if (!items.hasNext() && (c.getFinishedCount() == c.getStartedCount())) {
f.done(null, results);
return;
}
if(c.isBelowCapacity()){
RunMap(items,m,results,c,s,f);
}
}
但最终我不需要在调用 RunMap()
或 f.done()
时在 c 上同步,我只需要在执行条件检查/if 语句时在 c 上同步。
我应该只让 c 上的方法同步,然后去掉同步块吗?
Should I just make the methods on c synchronized, and then get rid of the synchronized block?
不,更好的方法是在同步块中进行检查,然后再进行其余工作:
boolean bFDone = false;
boolean bRunMap = false;
synchronized (c) {
bFDone = !items.hasNext() && (c.getFinishedCount() == c.getStartedCount());
bRunMap = !bFDone && c.isBelowCapacity();
}
if (bFDone) {
f.done(null, results);
} else if (bRunMap) {
RunMap(items,m,results,c,s,f);
}
这个版本的最大优点是,所有可变代码实际上是同步的,其余(可能很慢)的东西稍后发生。
正如对此答案的评论中正确提到的那样,如果您的初始假设是正确的,即整个块不需要同步,这只会正确工作。如果您需要立即对条件做出反应,那么该块实际上需要同步(完全)。
同步 c
的方法可能不是一个好主意。首先,这意味着 无论何时 你调用它们,无论上下文如何,它们都会同步,这可能不是你的意思。其次,它无助于自动解决条件 !items.hasNext()
和 c.getFinishedCount() == c.getStartedCount()
.
一种选择是在 synchronized
块内初始化 boolean
变量,然后在它们之外执行相关调用:
final boolean isDone;
synchronized(c) {
isDone = !items.hasNext() && (c.getFinishedCount() == c.getStartedCount());
}
if (isDone) {
f.done(null, results);
return;
}
final boolean isBelowCapacity;
synchronized(c) {
isBelowCapacity = c.isBelowCapacity();
}
if (isBelowCapacity) {
RunMap(items,m,results,c,s,f);
}