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

标签 java multithreading concurrency thread-safety

使用 Thread 的方法,如 setName/getName 和其他来自不同线程的方法是否安全? API没说什么,看源码就知道了

private char name[];

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

public final String getName() {
    return String.valueOf(name);
}

看来可能会导致内存一致性错误。

最佳答案

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

虽然一直很困惑为什么 Thread 使用 char[] 来保存它的名字,但你提出了一个更重要的问题,getName() 显然没有正确同步。如果一个线程执行 setName("abcd"),另一个线程可能会观察到 getName()->"ab\0\0"

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

关于java - 所有线程方法(如 getName/setName)都是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15419860/

相关文章:

multithreading - 线程中的 Delphi 位图

java - 为什么 count less 还要用 synchronized 关键字呢?

java - Hibernate session 和并发

java - Java 动态绑定(bind)条件

java - 关于 Echoclient 程序的问题

ruby - 为什么一次加入 5 个线程会导致同时事件?

multithreading - 操作系统是否知道应用程序线程?

java - 是否可以对实例初始化和分配给共享变量进行重新排序?

java - 如何在java 1.4中播放wav文件

java - 一维到二维,无限循环