来自PrintStream.class
:
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
synchronized(this)
的重点是什么? public synchronized void println(Object x){...}
并删除synchronized(this)
是不是一样?答案 0 :(得分:3)
synchronized
可防止多个线程同时进入方法或块。 print
和println
不是线程安全的方法,这意味着如果你有两个线程同时调用它们,输出可能会混合。
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
的另一个线程突然出现在中间并且在打印换行符之前打印自己的数据,则不会这样做。