SimpleThreads示例中的threadMessage应该同步吗?

时间:2014-11-14 14:50:20

标签: java multithreading static thread-safety

SimpleThreads example中的threadMessage方法原则上应该是synchronized吗?

1 个答案:

答案 0 :(得分:6)

假设你的意思是this code

// Display a message, preceded by
// the name of the current thread
static void threadMessage(String message) {
    String threadName =
        Thread.currentThread().getName();
    System.out.format("%s: %s%n",
                      threadName,
                      message);
}

我的答案是否定的,没有共享状态可以保护,因此不需要进一步锁定(在已调用的内容中已经完成的内容)。

获取currentThread已经完成了所需的任何锁定(如果有的话)。 format方法将格式化的字符串写入stdout,其中PrintStream进行锁定以确保写入的消息不会混杂在一起,并且每行都会单独写入。

将线程名存储在局部变量threadName中意味着它在自己的堆栈帧上有自己的存储(为该特定方法调用分配),本地变量内容不能被任何其他对此方法的调用覆盖(由另一个线程或由同一个线程)。如果threadName是一个静态变量,那么你需要进行同步,以便在调用currentThread方法和format方法之间不会被覆盖。使变量本地变得简单。

如果多个线程同时调用此方法,则除了条目可以在stdout中以不同顺序显示之外,没有任何机会发生任何事情。无论如何都会发生这种情况。