Java 多线程同步使用

Java Multithreading synchronized usage

我对以下代码(在两个选项之间)的输出结果以及原因感到困惑: 根据我的理解,输出应该是 option1,因为使用了 synchronized 关键字。

输出选项:

  1. Java 线程 ThreadExample Java 多线程。
  2. 无法确定打印文本的顺序。
    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 thread" 会先于 "Mutithreading Example"。它可能会发生,也可能不会。

其次,运行 方法上的同步关键字无关紧要,因为每个线程都锁定在自己的监视器上。因此,没有理由认为 "Java" 和 "thread" 必须一起打印,中间没有任何内容。它可能会发生,也可能不会。

这里重要的锁在 StringBuffers 和 stdout PrintStream 上。这些对象在它们的方法上使用同步,获取监视器并在方法调用期间保持它。这可以防止修改同一对象状态的并发调用相互干扰。