Java LocalTime实现线程安全

Java LocalTime achieve thread safety

LocalTime 的文档说它是线程安全的。我知道它本身是线程安全的。 但是如果我像这样在多个线程之间共享它是线程安全的吗?

public class Timesheet {

private static boolean run = true;

private static LocalTime activity;

public static void main(String[] args) {

    CompletableFuture.runAsync(() -> {
        activity =  LocalTime.now();
    }

    CompletableFuture.runAsync(() -> {
        activity =  LocalTime.now();
    }

    try {
        while (run) {
           Thread.sleep(12000);
           run = false; 
        }
    } catch (InterruptedException e) {
        
    } finally {
        //print activity
    }
}

我正在尝试获取准确的时间。如果我要在主线程中检查 activity 的时间。准确吗?

编辑:

我现在明白为什么我的代码不是线程安全的了。如果我要在同步代码中操作 LocalTime 实例,那会使我的代码线程安全吗?

CompletableFuture.runAsync(() -> {
    synchronized (activity) {
        activity = LocalTime.now();
    }
}       

LocalDate 不仅仅是线程安全的。

它是不可变的

线程安全,就类型而言,指的是当你改变对象时会发生什么的概念 - 你这样做,总是,通过一个点:someExprThatRefersToThatObject.field = foosomeExprThatRefersToThatObject.method() 其中该方法将导致对象以某种方式被更改。

None 这些事情都可以通过 LocalDate 实现。没有修改东西的方法,也没有你可以修改的字段。相反,LocalDate 具有根本不修改对象的方法;相反,他们 return 新的。例如,someDate.plusDays(1) 根本不会改变 someDate。它只是 return 一个新的 LocalDate 对象。

这意味着如果您编写 activity = LocalTime.now(); 之类的代码,则 您的 引用会发生变化,并且其线程安全性与 LocalTime 相关,这一切都与你.

具体来说,在您的示例中,这不是线程安全的。 activity 的类型是什么并不重要。它可以是 intStringLocalTimeArrayList 或您喜欢的任何其他内容:更改字段而不与读取它的代码建立 comes-before 关系,坏了,而你正在这样做。

某些方法可能规定它们是线程安全的。作为一般规则,尝试在线程之间共享数据比仅仅调用一堆这些方法和祈祷要复杂得多。