有条件地定义同步块
Conditionally define synchronized block
说我有一个方法:
public void run(){
synchronized(this.foo){
}
}
但有时当我 运行 使用此方法时,我不需要同步任何内容。
有条件地同步某些东西的好模式是什么?我能想到的唯一模式是回调,像这样:
public void conditionalSync(Runnable r){
if(bar){
r.run();
return;
}
synchronized(this.foo){
r.run();
}
}
public void run(){
this.conditionalSync(()->{
});
}
还有没有回调的其他方法吗?
而不是 synchronized
关键字,也许您可以使用 ReentrantLock
(which is more flexible and powerful)。
示例:
ReentrantLock lock = ...;
public void run(){
if (bar) {
lock.lock();
}
try {
// do something
} finally {
if (lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
}
说我有一个方法:
public void run(){
synchronized(this.foo){
}
}
但有时当我 运行 使用此方法时,我不需要同步任何内容。
有条件地同步某些东西的好模式是什么?我能想到的唯一模式是回调,像这样:
public void conditionalSync(Runnable r){
if(bar){
r.run();
return;
}
synchronized(this.foo){
r.run();
}
}
public void run(){
this.conditionalSync(()->{
});
}
还有没有回调的其他方法吗?
而不是 synchronized
关键字,也许您可以使用 ReentrantLock
(which is more flexible and powerful)。
示例:
ReentrantLock lock = ...;
public void run(){
if (bar) {
lock.lock();
}
try {
// do something
} finally {
if (lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
}