Java多线程同步用法

问题描述 投票:-2回答:1

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

输出选项:

  1. Java线程ThreadExample JavaMultithreading。
  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 multithreading synchronized
1个回答
0
投票

首先,没有告诉哪个线程将在另一个线程之前运行。因此,您不能断言“ Java线程”将在“ Mutithreading示例”之前。

第二,两个线程之间没有共享锁。每个都锁定在自己的监视器上。因此,没有理由认为例如“ Java”和“线程”必须打印在一起而中间没有任何东西。它可能发生,它不会发生。

这里重要的锁在StringBuffers和stdout PrintStream上。这些类在它们的方法上使用同步的方法,获取监视器并在方法调用期间将其保留。这样可以防止来自不同线程的并发追加调用相互干扰。

© www.soinside.com 2019 - 2024. All rights reserved.