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();
}
}
解决方案 »
- 求助:由于无法安装J2SDK引起的系列问题
- 买那本书学呢?
- 加急!!!对数据进行分类的问题(在线等解)
- 请问这个题如何做啊.....散分再线等~~~~~
- 关于package,一个让初学者迷惑不已的问题!请都进来谈谈。
- 怎样将所需的java自带的包(部分,如java.xml.*,)分离出来,形成一个新包
- 请教我用JBUILDER7.0
- 请教,参与有分
- 关于Java.....
- 斑竹,救救我!各位大虾,打搅一下,不好意思!专家门诊做得真不错,我很想用Offilne Explorer把它当下来,但下载下来浏览时,具体的帖子内容总是看不见,那页在出现“正在等待连接,请稍后”几个字后,总是变成一片空白,唉,怎么办呢?
- java的inputstreamreader的问题
- 我的jar文件在自己的电脑双击不能运行,可是在别人的电脑可以运行。
因为StringBuffer中的方法可以修改本身。
我按lz的例子跑了一下,结果还是证明了。
我不知道lz是如何操作的,显示的结果如何?
我这里也显示正常啊,不知道lz是怎么操作的,
StringBuilder才不是线程安全的,
- -!
我已经出现了。但如果是同步那两个方法。可以输出得到保证。
你的例子核心就是多线程调用同一StringBuffer 的append方法,这跟他是不是线程安全不搭尬呀,除非你的结果是append的一系列字符串变乱了,那才能说明他是线程不安全的。 不明白可以再问。
appand() 最后数据就是乱的了 这个情况还是有的吧线程安全 并不是说他的一系列操作是同步的 只是对于他执行某个方法的时候不允许别的线程去改变大家给意见 是不是这样
我上面已经回答了,我看错了。输出显示顺序不一定当然是有可能的,因为log方法没有上锁,每个现在在append锁释放后,都可能得到cpu的执行片段。针对一个类来说是不是线程安全就要看,多个线程在同时在运行,这些线程可能会同时执行某个方法。但是每次运行结果和单线程执行的结果一样,那么就可以说是线程安全的。其实从源码就能看出能修改StringBuffer的方法都已经添加了synchronized了。
所谓“线程安全”表示其本身的操作对其他线程可见,具体StringBuffer就是说中间不会出现脏数据,而你这是线程同步问题,具体到你这个问题即几个线程如何协作按顺序输出结果.