gpt4 book ai didi

java - 我可以从构造函数启动线程吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:29:51 24 4
gpt4 key购买 nike

鉴于 J5+ 内存模型 (JSR-133),以下代码是线程安全的并且是允许的吗?

如果它是安全的,在某些情况下是否可以接受?

public final class BackgroundProcessor
extends Object
implements Runnable
{

public BackgroundProcessor(...) {
super();

...

new Thread(this).start();
}

public void run() {
...
}
}

当我阅读新的 JMM 规范时,启动线程会与启动的线程所做的任何事情建立先行关系。

假设该对象在构造函数中设置了私有(private)成员变量,并在 run() 中使用。

并且该类被标记为 final 以防止子类化意外。

注意:这里有一个类似的问题,但是角度不同:calling thread.start() within its own constructor

最佳答案

JLS: Threads and Locks

Two actions can be ordered by a happens-before relationship. If one action happens-before another, then the first is visible to and ordered before the second.

If we have two actions x and y, we write hb(x, y) to indicate that x happens-before y.

  • If x and y are actions of the same thread and x comes before y in program order, then hb(x, y).

A call to start() on a thread happens-before any actions in the started thread.

因此我们可以得出结论,调用 Thread.start() 之前构造函数中的所有操作都先于启动的线程中的所有操作发生。如果 Thread.start() 是对对象字段的所有写入,则启动的线程将看到对对象字段的所有写入。如果没有其他写入字段(另一个线程将读取),则代码是线程安全的。

关于java - 我可以从构造函数启动线程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/850160/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com