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才不是线程安全的,
------解决方案--------------------
------解决方案--------------------StringBuilder才不是线程安全的
StringBuilder和StringBuffer的方法是一模一样,就是一个多线程和一个单线程的问题
------解决方案--------------------我都不知道你是怎么认为StringBuffer不是线程安全的
------解决方案--------------------楼主的例子不用跑,结果就很明显,只是你的例子不能证明StringBuffer是线程不安全的啊。
你的例子核心就是多线程调用同一StringBuffer 的append方法,这跟他是不是线程安全不搭尬呀,除非你的结果是append的一系列字符串变乱了,那才能说明他是线程不安全的。 不明白可以再问。
------解决方案--------------------
------解决方案--------------------这个例子 应该有可能出现最后getContents()方法 出来的数据显示是乱的吧
多个线程拿到同一个对象StirngBuffer , 同时调用同一个方法 , A线程执行appand()以后 接着 B线程执行
appand() 最后数据就是乱的了 这个情况还是有的吧
线程安全 并不是说他的一系列操作是同步的 只是对于他执行某个方法的时候不允许别的线程去改变
大家给意见 是不是这样
------解决方案--------------------
------解决方案--------------------