匿名线程类的输出未同步

时间:2014-03-15 01:59:19

标签: java multithreading

我有以下代码段。

public class Test {
     static final StringBuffer sb1 = new StringBuffer();  
     static final StringBuffer sb2 = new StringBuffer();  
     public static void main(String args[])  
     {  
        new Thread()  
        {  
           public void run()  {  
            synchronized(this)  
            {  
                try {
                sb1.append("A");  
                sb2.append("B"); 
                System.out.println (sb1 + " " + sb2);   
                Thread.currentThread().sleep(5000);  
                    h.sb1.append("U"); 
                    h.sb2.append("V");
                    System.out.println (sb1 + " " + sb2);  
                 } catch (InterruptedException e) {  
                    // TODO Auto-generated catch block  
                    e.printStackTrace();  
                }
            }  
           }  
        }.start();   
        new Thread() 
        { 
        public void run() 
        { 
            synchronized(this) 
            { 
                sb1.append("C"); 
                sb2.append("D"); 
                System.out.println (sb1 + " " + sb2);  
            } 
        }  
    }.start(); /* Line 28 */

    new Thread() 
        { 
        public void run() 
        { 
            synchronized(this) 
            { 
                sb1.append("E"); 
                sb2.append("F"); 
                System.out.println (sb1 + " " + sb2);
            } 
        }  
    }.start();  

    }
}

当我运行该程序时,看起来它在对象级别不同步。我得到的输出是:

A B
AC BD
ACE BDF
ACEU BDFV

我期待预期的输出为

A B
AU BV
AUC BVD
AUCE BVDF

有人可以澄清一下这个关键字的含义吗?此外,如果我使用synchronize(this.getThreadGroup())而不是synchronized(this)。我得到了预期输出的输出。

1 个答案:

答案 0 :(得分:3)

synchronized(this)

在这种情况下不起作用,因为this将引用Thread对象,并且每个run函数都在自己的线程中运行。

如果您使用synchronized(sb1),您的代码应按预期工作。您可以在所需的每个对象上进行同步,java将锁定语句上的对象并在括号后释放它。你应该只关心,你真的在​​同一个对象上同步。