Java In System.Out.println()什么';同步这个块的目的是什么?
从Java In System.Out.println()什么';同步这个块的目的是什么?,java,Java,从PrintStream.class: public void println(Object x) { String s = String.valueOf(x); synchronized (this) { print(s); newLine(); } } 同步(这个)有什么意义 执行public synchronized void println(Object x){…}和删除synchronized(this)不是一样吗 synchr
PrintStream.class
:
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
同步(这个)
有什么意义李>
public synchronized void println(Object x){…}
和删除synchronized(this)
不是一样吗synchronized
防止多个线程同时进入方法或块print
和println
不是线程安全的方法,这意味着如果有两个线程同时调用它们,输出可能会混合
e、 g.线程1调用print('Hello World')
就在线程2调用print('bye World')
的时候。输出可能看起来像HeGoodbyello W Woorldrld
这里使用synchronized(this)
而不是将synchronized
放在方法上的原因是String.valueOf(x)
不需要阻塞其他线程,因此被放置在临界段之外
通常,您希望尽可能少地放入关键部分,以防止线程等待浪费时间。1:避免多个线程在同一行中写入,导致两行混合。(至少该行和以下换行符()可能出现故障) 2:几乎,当删除
synchronized(this)
时,整个方法被阻塞,因此包括valueOf()
,原始代码仅在必要时阻塞
通常,访问共享资源时需要同步。在本例中,这是控制台。字符串s不是多线程共享的,因此不需要同步。- 同步的要点是,当您调用
时,您希望在数据的末尾打印一个换行符。如果另一个线程使用同一个代码> PrtStave<代码>突然出现在中间,在打印新行之前打印自己的数据。println
- 这与同步整个方法的区别在于,不允许不同线程并行地将其数据转换为字符串是没有意义的。每个线程都可以在不争夺公共资源(流)的情况下转换其值,只有这样它们才能进入关键部分