我有两个Singleton对象的实例方法method1method2.method1可以由单独的线程并发运行.这意味着我们可以有5个线程,每个线程同时运行method1,或者1个线程同时运行method2.

我想阻止method1method2运行时运行,而method2method1运行时运行.

我想像下面的代码一样同步两个方法,这解决了两个方法不能同时执行的问题,但它也会阻止我的5个线程同时运行method1,即使method2没有运行.

void synchronized method1() {
     //do something
}

void synchronized method2() {
    //do other thing
}

第一次使用Java多线程所以感谢大家的建议,谢谢.

EDIT:看起来readWriteLock岁是个不错的 Select

推荐答案

在这种情况下使用ReadWriteLock比较方便. 正如documentation人所说:

读锁定可以由多个读取器线程同时持有, 只要没有作家.而写锁是独占的.

代码可能如下所示:

  ReentrantReadWriteLock lock = new ReentrantReadWriteLock();

  void method1() {
    final var readLock = lock.readLock();
    try {
      readLock.lock();
      //do something
    }
    finally {
      readLock.unlock();
    }
  }

  void method2() {
    final var writeLock = lock.writeLock();
    try {
      writeLock.lock();
      //do other thing
    }
    finally {
      writeLock.unlock();
    }
  }

Java相关问答推荐

无法运行Java(已解决)

更新我们的一个文物后出现了严重的符号引用错误

强制Mockito返回null而不是emtpy list

条件加载@ManyToMany JPA

对于几乎不涉及逻辑的请求,您是否应该使用命令模式?

为什么Java Annotation接口覆盖对象类中的方法

如何从错误通道回复网关,使其不会挂起

测试何时使用Mockito强制转换对象会导致ClassCastException

用户填充的数组列表永不结束循环

声明MessageChannel Bean的首选方式

Tinylog中的滚动文件会在每次应用启动时覆盖日志(log)文件

基于配置switch 的@Controller的条件摄取

Cordova Android Gradle内部版本组件不兼容

Spring Boot中的应用程序.properties文件中未使用的属性

在整数列表中查找和可被第三个整数整除的对时出现无法解释的RunTimeError

将BlockingQueue+守护程序线程替换为执行器

如何使用Hibernate v6.2构建NamingStrategy,以表名作为所有列的前缀?

升级版本后出现非法访问错误

Maven创建带有特定类的Spring Boot jar和普通jar

将在 Docker 中运行的 Spring Boot 连接到在 Docker 中运行的 PostgreSQL,无需 compose 文件?