Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java In System.Out.println()什么';同步这个块的目的是什么?_Java - Fatal编程技术网

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不是多线程共享的,因此不需要同步。

    • 同步的要点是,当您调用
      println
      时,您希望在数据的末尾打印一个换行符。如果另一个线程使用同一个代码> PrtStave<代码>突然出现在中间,在打印新行之前打印自己的数据。
    • 这与同步整个方法的区别在于,不允许不同线程并行地将其数据转换为字符串是没有意义的。每个线程都可以在不争夺公共资源(流)的情况下转换其值,只有这样它们才能进入关键部分