为什么我们需要一个静态锁来同步system.out.println()?

use*_*375 0 java multithreading synchronization scjp

我正在攻读java认证,我从Mughal的书中看到了这个例子:

public class Smiley extends Thread
{
    @Override
    public void run()
    { 
        while(true)
        { 
            synchronized(this)
            {
                try
                { 
                    System.out.print(":"); 
                    Thread.sleep(100); 
                    System.out.print("-"); 
                    Thread.sleep(100); 
                    System.out.println(")"); 
                    Thread.sleep(100); 
                }
                catch(InterruptedException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }


    public static void main(String[] args)
    {
        new Smiley().start();
        new Smiley().start();
    }
}
Run Code Online (Sandbox Code Playgroud)

目的是每行打印一个笑脸:-).我的问题是,为什么同步实例(这个)不能实现这一点?为什么我们需要在静态级别上同步?

谢谢,

Jon*_*art 6

因为请注意main()函数创建两个 Smiley类.他们每个人都在自己的线程上运行.由于它们是锁定的this,它们都将立即获得锁定,而不会与另一个线程争用.在这种情况下,他们的锁定方案synchronize(this)完成任何事情.

在处理多线程问题时,您必须考虑"我想保护什么?" 在这种情况下,您需要保护System.out,以确保您按照您想要的顺序访问它.由于System.out是静态的,因此您需要某种外部作用域锁定,每个线程在写入之前必须获取这些锁定 .

您可以使用ReentrantLock来实现此目的.