Java多线程同步使用

Java多线程同步使用,java,multithreading,synchronized,Java,Multithreading,Synchronized,我不清楚以下代码在两个选项之间的输出是什么,以及为什么: 根据我的理解,输出应该是option1,因为使用了synchronized关键字 输出选项: Java线程示例Java多线程。 无法确定文本的打印顺序。 首先,不知道哪个线程将在另一个线程之前运行。所以您不能肯定地断言Java线程将先于多线程示例。它可能会发生,也可能不会 其次,run方法上的synchronized关键字是不相关的,因为每个线程都锁定在自己的监视器上。因此,没有理由认为Java和thread必须一起打印,中间没有任何内容

我不清楚以下代码在两个选项之间的输出是什么,以及为什么: 根据我的理解,输出应该是option1,因为使用了synchronized关键字

输出选项:

Java线程示例Java多线程。 无法确定文本的打印顺序。
首先,不知道哪个线程将在另一个线程之前运行。所以您不能肯定地断言Java线程将先于多线程示例。它可能会发生,也可能不会

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


这里起作用的锁在StringBuffers和stdout打印流上。这些对象在其方法上使用synchronized,获取监视器并在方法调用期间保持它。这可以防止修改同一对象状态的并发调用相互干扰

首先,不知道哪个线程将在另一个线程之前运行。所以您不能肯定地断言Java线程将先于多线程示例。它可能会发生,也可能不会

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


这里起作用的锁在StringBuffers和stdout打印流上。这些对象在其方法上使用synchronized,获取监视器并在方法调用期间保持它。这可以防止修改同一对象状态的并发调用相互干扰

您不知道输出将是什么-为什么不运行代码并亲自查看?为什么您认为使用synchronizedthis可以做任何事情?这是您正在创建的两个完全独立的线程对象。您不知道输出将是什么-为什么不运行代码并亲自查看?为什么您认为使用synchronizedthis可以做任何事情?这是您正在创建的两个完全独立的线程对象。
    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(); }}