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

方法必须是线程安全的?

章誉
2023-03-14
@PostMapping
public ResponseEntity<?> <name> (<args>) {
<do something>
<do something very time consuming>
<return response>
}
@PostMapping
public ResponseEntity<?> <name> (<args>) {
<do something>

CompletableFuture.runAsync(() -> {
   new <NewClass>.<NewMethod>(<args>);
});

<return response>
}

看起来它工作得很好,但我想知道我是否必须确保新代码需要线程安全?这里有什么意见吗?抱歉用了假名字,提前致谢。

共有1个答案

公孙棋
2023-03-14

如果您需要对将来的任务进行同步,您可以简单地在将来的相关方法上添加已同步的关键工作,例如:

public class SafeFuture {

    public void doWorkSynced() {
        System.out.println("doing something quick starting");
        CompletableFuture.runAsync(this::doWorkInBackground);
        System.out.println("doing something quick done");
    }

    private synchronized void doWorkInBackground() {
        try {
            System.out.println("doing something slower starting");
            Thread.sleep(1000);
            System.out.println("doing something slower done");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args) throws Exception {
        SafeFuture safeFuture = new SafeFuture();
        safeFuture.doWorkSynced();
        safeFuture.doWorkSynced();
        Thread.sleep(5000);
    }
}

输出为:

doing something quick starting
doing something quick done
doing something quick starting
doing something quick done
doing something slower starting
doing something slower done
doing something slower starting
doing something slower done

如您所见,不在运行的耗时任务是并行的

 类似资料:
  • IBM的支持指出,Class.GetAnnotation的实现不是线程安全的。 与其他JVM实现(例如,OpenJDK)相比,我们可以看到它们以线程安全的方式实现类方法。IBM JVM是一个闭源JVM,他们确实会发布一些源代码和他们的JVM一起,但无论什么时候他们的类实现是否线程安全,都不足以做出明确的判断。 类文档没有清楚地说明它的方法何时是线程安全的。那么,将类方法(特别是getAnnotat

  • 例如,以下方法: 我关心的是如果我有多个线程调用。对象是否可能被另一个线程覆盖?换句话说,Thread 1调用并获取返回的

  • 问题内容: 方法getText()必须从UI线程调用,请提供帮助。我是android studio的初学者,可以在网上找到这些代码,但无法弄清楚,我真的很感激。 问题答案: 在其UI线程而非后台线程中获取值。

  • 问题内容: 我有多个线程试图更新MySQL数据库?使用executeUpdate方法是线程安全的吗? 问题答案: 不,使用它不是线程安全的。 实际上,如果其他某个线程使用一条语句,然后另一个线程调用executeUpdate(),则另一个线程的s(如果有的话)将被关闭。“ javadoc.sql.Statement的JavaDoc(PreparedStatement是其子类型) ”如果存在打开的语

  • 问题内容: 在我的Java项目中,我需要以多种方式使用TreeMap。我发现ConcurrentSkipListMap是我需要的,但是某些方法不是线程安全的。其中之一- containsKey(Object key)。以多种方式使用此方法的典型解决方案是什么?在我的程序中,我需要放置不会替换旧密钥的密钥,如果不可能的话,我将放置另一个密钥而不会获得唯一密钥。因为我不会丢失信息,所以应该使用哪种构造

  • 问题内容: 根据Swing教程: 一些Swing组件方法在API规范中被标记为“线程安全”。这些可以从任何线程安全地调用。所有其他Swing组件方法都必须从事件分发线程中调用。忽略此规则的程序在大多数情况下都可以正常运行,但是会遇到难以预料的错误,这些错误很难重现。 但是这些标记为“线程安全”的Swing组件方法是什么?真的有吗? 更新/赏金: 是否有线程安全的摆动方法的 完整列表 ?(线程安全的