【问题标题】:Java Multithreading synchronized usage [duplicate]Java多线程同步使用[重复]
【发布时间】:2020-01-02 14:13:59
【问题描述】:

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

输出选项:

  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(); }}




【问题讨论】:

  • 您对输出将是什么感到困惑 - 为什么不运行代码并亲自查看?
  • 为什么你认为在这里使用synchronized(this) 有什么作用?这是您正在创建的两个完全独立的 Thread 对象。

标签: java multithreading synchronized


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-25
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    相关资源
    最近更新 更多