我对以下代码的输出(在两个选项之间)感到困惑,为什么:根据我的理解,输出应该是option1,因为使用了synced关键字。
输出选项:
class ThreadDemo extends Thread
{
final StringBuffer sb1 = new StringBuffer();
final StringBuffer sb2 = new StringBuffer();
public static void main(String args[])
{
final ThreadDemo h = new ThreadDemo();
new Thread()
{
public void run()
{
synchronized(this)
{
h.sb1.append("Java");
h.sb2.append("Thread");
System.out.println(h.sb1);
System.out.println(h.sb2);
}
}
}.start();
new Thread()
{
public void run()
{
synchronized(this)
{
h.sb1.append("Mutithreading");
h.sb2.append("Example");
System.out.println(h.sb2);
System.out.println(h.sb1);
}
}
}.start(); }}
首先,没有告诉哪个线程将在另一个线程之前运行。因此,您不能断言“ Java线程”将在“ Mutithreading示例”之前。
第二,两个线程之间没有共享锁。每个都锁定在自己的监视器上。因此,没有理由认为例如“ Java”和“线程”必须打印在一起而中间没有任何东西。它可能发生,它不会发生。
这里重要的锁在StringBuffers和stdout PrintStream上。这些类在它们的方法上使用同步的方法,获取监视器并在方法调用期间将其保留。这样可以防止来自不同线程的并发追加调用相互干扰。