szShareData是一个String,对他进行下面的赋值:
szShareData = "这是第 1 个线程";
会创建另外一个对象,这样szShareData就指向了另外一个对象。建议将szShareData改成StringBuffer。问题应该可以得到解决。但是需要注意:
给StringBuffer赋值的时候,要先将StringBuffer清空,再append:
StringBuffer sb = new StringBuffer();sb.delete(0, sb.length());
sb.append("这是第 1 个线程");

解决方案 »

  1.   

    这是修改后的程序,略有改动。/**=============================================================================
     * 文件:ThreadDemo_06.java
     * 描述:为什么造成线程的不同步。
     * =============================================================================
     */
    class ThreadDemo extends Thread{
      //共享一个静态数据成员
      //private static String  szShareData = "";
      private static StringBuffer  szShareData = new StringBuffer();
      
      ThreadDemo(){
      }
      
      ThreadDemo(String szName){
            super(szName);
      }
      
      public void run(){
       // 为了更清楚地看到不正确的结果,这里放一个大的循环
       for (int i = 0; i < 50; i++){
          if (this.getName().equals("Thread1")){
               synchronized(szShareData){
                 //szShareData = "这是第 1 个线程";
                 szShareData.delete(0,szShareData.length());
                 szShareData.append("这是第 1 个线程");
                 // 为了演示产生的问题,这里设置一次睡眠
                 try{
                         Thread.sleep((int)Math.random() * 100);
                 }catch(InterruptedException e){
                 }
                 // 输出结果
                 System.out.println(this.getName() + ":" + szShareData);
               }
          } else if (this.getName().equals("Thread2")){
                synchronized(szShareData){
                    //szShareData = "这是第 2 个线程";
                    szShareData.delete(0,szShareData.length());
                    szShareData.append("这是第 2 个线程");
                    // 为了演示产生的问题,这里设置一次睡眠
                    try{
                            Thread.sleep((int)Math.random() * 100);
                    }catch(InterruptedException e){
                    }
                    // 输出结果
                    System.out.println(this.getName() + ":" + szShareData);
                }
          }
      }
      }
    }public class ThreadMain{
      public static void main(String argv[]) throws Exception{
        ThreadDemo th1 = new ThreadDemo("Thread1");
        ThreadDemo th2 = new ThreadDemo("Thread2");    th1.start();
        th2.start();
            
        Thread.currentThread().join();
      }
    }
      

  2.   

    muymuy(muy)
    走召弓虽^_^