在System.Out.println()中,同步这个块是什么意思?

时间:2016-05-11 20:42:00

标签: java

来自PrintStream.class

public void println(Object x) {
    String s = String.valueOf(x);
    synchronized (this) {
        print(s);
        newLine();
    }
}
  1. synchronized(this)的重点是什么?
  2. 执行public synchronized void println(Object x){...}并删除synchronized(this)是不是一样?

3 个答案:

答案 0 :(得分:3)

synchronized可防止多个线程同时进入方法或块。 printprintln不是线程安全的方法,这意味着如果你有两个线程同时调用它们,输出可能会混合。

e.g。线程1在线程2调用print('Hello World')时调用print('Goodbye World')。输出可能看起来像HeGoodbyello W Woorldrld

此处使用synchronized(this)而不是将synchronized放在方法上的原因是因为String.valueOf(x)不需要阻止其他线程,因此放在临界区之外。

通常,您希望尽可能少地放入关键部分,以防止线程等待浪费时间。

答案 1 :(得分:2)

1。:为了避免多个线程写入同一行,导致两行混合。 (至少该行和以下newLine()可能无序)

2:差不多,当删除synchronized(this)时,整个方法被阻止,包括valueOf(),原始代码只在必要时阻止。

访问共享资源时通常需要同步。在示例中,这是控制台。 String s不是多个线程的共享,因此同步不是必要的。

答案 2 :(得分:2)

  • 同步点是,当您致电println时,您希望您的数据在其末尾打印换行符。因此,如果使用相同PrintStream的另一个线程突然出现在中间并且在打印换行符之前打印自己的数据,则不会这样做。
  • 它与同步整个方法之间的区别在于,不允许不同的线程将其数据并行转换为字符串是没有意义的。每个线程都可以转换它的值,而不需要争夺公共资源(流),然后它们就会进入关键部分。