public class StringBufferTest {
   private StringBuffer contents = new StringBuffer();
   public  void  log(String message){
      contents.append(System.currentTimeMillis());
      contents.append("; ");
      contents.append(Thread.currentThread().getName());
      for(int i=0;i<10000;i++){
         contents.append(i);
          contents.append(message);
          contents.append("\n");
      }      contents.append("\n\n\n");
   }
   public  void getContents(){
      System.out.println(contents);
   }
}class RunThread extends Thread{
   String message;
   StringBufferTest buffer;
   public RunThread(StringBufferTest buffer, String message){
      this.buffer = buffer;
      this.message = message;
   }
   public void run(){
      while(true){
         buffer.log(message);
         buffer.getContents();
      }
   }
   public static void main(String[] args) {
      StringBufferTest ss = new StringBufferTest();
      new RunThread(ss, "love").start();
      new RunThread(ss, "make").start();
      new RunThread(ss, "you").start();
   }
}

解决方案 »

  1.   

    不是线程安全的。
    因为StringBuffer中的方法可以修改本身。
      

  2.   

    StringBuffer是线程安全的,里面的方法用了synchronized修饰,也就是单线程的
    我按lz的例子跑了一下,结果还是证明了。
    我不知道lz是如何操作的,显示的结果如何?
      

  3.   

    StringBuffer是线程安全的啊,
       我这里也显示正常啊,不知道lz是怎么操作的,
    StringBuilder才不是线程安全的,
      

  4.   

    汗,StringBuffer是线程安全的。看java多线程设计模式的Immutable Pattern看糊涂了。
    - -!
      

  5.   

    大哥你for一万次,就会出现不同步了。
    我已经出现了。但如果是同步那两个方法。可以输出得到保证。
      

  6.   

    StringBuilder才不是线程安全的StringBuilder和StringBuffer的方法是一模一样,就是一个多线程和一个单线程的问题
      

  7.   

    我都不知道你是怎么认为StringBuffer不是线程安全的
     
      

  8.   

    楼主的例子不用跑,结果就很明显,只是你的例子不能证明StringBuffer是线程不安全的啊。
    你的例子核心就是多线程调用同一StringBuffer 的append方法,这跟他是不是线程安全不搭尬呀,除非你的结果是append的一系列字符串变乱了,那才能说明他是线程不安全的。 不明白可以再问。
      

  9.   

    这个例子 应该有可能出现最后getContents()方法 出来的数据显示是乱的吧多个线程拿到同一个对象StirngBuffer , 同时调用同一个方法 , A线程执行appand()以后 接着 B线程执行
    appand() 最后数据就是乱的了   这个情况还是有的吧线程安全  并不是说他的一系列操作是同步的  只是对于他执行某个方法的时候不允许别的线程去改变大家给意见  是不是这样
      

  10.   


    我上面已经回答了,我看错了。输出显示顺序不一定当然是有可能的,因为log方法没有上锁,每个现在在append锁释放后,都可能得到cpu的执行片段。针对一个类来说是不是线程安全就要看,多个线程在同时在运行,这些线程可能会同时执行某个方法。但是每次运行结果和单线程执行的结果一样,那么就可以说是线程安全的。其实从源码就能看出能修改StringBuffer的方法都已经添加了synchronized了。
      

  11.   

     照楼主这么理解,任何号称线程安全的我都可以举出线程不安全的例子了。
     所谓“线程安全”表示其本身的操作对其他线程可见,具体StringBuffer就是说中间不会出现脏数据,而你这是线程同步问题,具体到你这个问题即几个线程如何协作按顺序输出结果.