使用 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/