所有Thread方法(如getName/setName)都是线程安全的吗?

Evg*_*eev 12 java concurrency multithreading thread-safety

使用/ 和其他一些来自不同线程Thread的方法是否安全?API没有说什么,而是根据源代码判断setNamegetName

private char name[];

public final void setName(String name) {
    checkAccess();
    this.name = name.toCharArray();
}

public final String getName() {
    return String.valueOf(name);
}
Run Code Online (Sandbox Code Playgroud)

它似乎可能导致内存一致性错误.

Zho*_*gYu 4

Thread.getName()是任何人都可以随时查询的属性。例如,监视器实用程序不断查询所有线程的名称。因此该方法必须是线程安全的,否则就没有明确的协议来说明谁可以安全地访问它以及何时访问它。

尽管一直令人困惑为什么Thread使用 achar[]来保存其名称,但您提出了一个更重要的问题,getName()显然没有正确同步。如果一个线程这样做setName("abcd"),另一线程可能会观察getName()->"ab\0\0"

我会将问题发布到并发兴趣列表中。请参阅http://cs.oswego.edu/pipermail/concurrency-interest/2013-March/010935.html

  • 为何如此?`String.valueOf()` 的输入要么是原始的 `char[]` 数组,要么是新数组,但实际的数组都没有被编辑。 (3认同)