当前位置: 首页 > 知识库问答 >
问题:

有条件地定义同步块

阎乐池
2023-03-14

假设我有一个方法:

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(()->{


  });
}

有没有别的方法,不用回拨?

共有1个答案

伍溪叠
2023-03-14

与其使用synchronized关键字,不如使用ReentrantLock(更灵活、更强大)。

例子:

ReentrantLock lock = ...;


public void run(){
    if (bar) {
        lock.lock();
    }

    try {
        // do something

    } finally {
        if (lock.isHeldByCurrentThread()) {
            lock.unlock();
        }
    }
}
 类似资料:
  • 我有如下代码: 在我的属性文件中,我有: 这不起作用,parseFooBar在第一秒每分钟都被执行。 但是,如果我添加字段: 所以我可以做一个日志,看看它是什么,parseFooBar不会被执行。移除注入的字符串会再次看到parseFooBar执行。我做错了什么? 编辑:这是使用Spring 4.1.5,Spring Boot 1.2.1和JDK 8 编辑2:将注释移动到类型也有效。(无需强制使用

  • 有部分条件如 target_os 在使用 rustc 时会隐式地提供,但是自定义条件必须使用 --cfg 标记来传给 rustc。 #[cfg(some_condition)] fn conditional_function() { println!("condition met!") } fn main() { conditional_function(); } 不使用自定义的

  • 我有一个树视图,其中单元格必须根据TreeItem值的实际实现显示不同的信息。 我的域模型如下所示: 在我看来,将“如何在单元格中显示任务”或“如何在单元格中显示组”的行为分为两个不同的类是很自然的。 下面的控制器类包含一个树视图,我在其中设置CellFactory。 但现在我被困在这里,无法决定我必须返回哪种类型的牢房。事实上,我只有相关的TreeView参数,而没有相关的TreeItem! 在

  • 我希望我的应用程序从RabbitMQ中的“消息”队列中读取一些内容,如果消息是“ping”,则用“pong”响应同一队列。到目前为止,我已经尝试了两件事: 一个消费者和供应商连接一个队列,但我总是得到"不能撰写任何与消费者"当应用程序启动。 当输入和输出队列不同时,这是可行的,但我的要求是它们相同。 java.util.函数,如果条件不满足,则返回null。 当接收到非“ping”的内容时,我会看

  • 问题内容: 我想基于从客户端传递的String参数注入一个bean。 我希望基于传递的参数注入报表实例。任何帮助将不胜感激。提前致谢 问题答案: 使用工厂方法模式: 当您使用以下命令调用控制器时,Spring可以创建报告类型: 但是,它非常笨拙,并且每次添加新报告类型时都需要进行修改。如果报告类型列表已修复,则可以。但是,如果您计划添加越来越多的类型,这将是一个更可靠的实现: 通过此实现,添加新的

  • 对于在其生命周期的某个点隐藏的组件,呈现它的最佳方式是什么?1)渲染组件,但不显示它(显示:无)。2)只在需要时渲染组件。什么对性能更好?如果组件的道具和状态稍后更新,是否最好让组件存在,但隐藏在虚拟DOM中? 或者这个: