日期:2014-05-20  浏览次数:20892 次

StringBuffer是线程安全吗?我有例子说它不是安全的。
Java code

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



------解决方案--------------------
不是线程安全的。
因为StringBuffer中的方法可以修改本身。
------解决方案--------------------
我的沙发。
------解决方案--------------------

------解决方案--------------------
StringBuffer是线程安全的,里面的方法用了synchronized修饰,也就是单线程的
我按lz的例子跑了一下,结果还是证明了。
我不知道lz是如何操作的,显示的结果如何?
------解决方案--------------------
StringBuffer是线程安全的啊,
我这里也显示正常啊,不知道lz是怎么操作的,
StringBuilder才不是线程安全的,
------解决方案--------------------
探讨
不是线程安全的。
因为StringBuffer中的方法可以修改本身。

------解决方案--------------------
StringBuilder才不是线程安全的

StringBuilder和StringBuffer的方法是一模一样,就是一个多线程和一个单线程的问题
------解决方案--------------------
我都不知道你是怎么认为StringBuffer不是线程安全的
 
------解决方案--------------------
楼主的例子不用跑,结果就很明显,只是你的例子不能证明StringBuffer是线程不安全的啊。
你的例子核心就是多线程调用同一StringBuffer 的append方法,这跟他是不是线程安全不搭尬呀,除非你的结果是append的一系列字符串变乱了,那才能说明他是线程不安全的。 不明白可以再问。
------解决方案--------------------
探讨
不是线程安全的。
因为StringBuffer中的方法可以修改本身。

------解决方案--------------------
这个例子 应该有可能出现最后getContents()方法 出来的数据显示是乱的吧

多个线程拿到同一个对象StirngBuffer , 同时调用同一个方法 , A线程执行appand()以后 接着 B线程执行
appand() 最后数据就是乱的了 这个情况还是有的吧

线程安全 并不是说他的一系列操作是同步的 只是对于他执行某个方法的时候不允许别的线程去改变

大家给意见 是不是这样
------解决方案--------------------
探讨
引用:
不是线程安全的。
因为StringBuffer中的方法可以修改本身。

线程安全是指任何时刻都只有一个线程访问临界资源

------解决方案--------------------
探讨

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