在Java中,有三个操作字符串的类:
* String: 操作不可修改的字符串
* StringBuffer: 操作可修改的字符串,线程安全
* StringBuilder: 操作可修改的字符串,从Java 1.5开始引入,线程不安全,但操作比StringBuffer快。
在开发ugame p7的时候发现我对StringBuffer的线程安全发生误解。
Java的StringBuffer的线程安全并不是说只要操作StringBuffer就是线程安全,
而是说对StringBuffer对象的插入和追加操作对于同一StringBuffer实例而言是原子的,
不允许对同一StringBuffer实例的其它插入和追加操作和这个操作交错执行。
也就是说,多个读出写入的原子操作组成的操作并不原子:
用户界面读取一个StringBuffer静态对象GlobalCall.outputBuffer
然后把它清空:
//用定时器优化日志输出 display.timerExec(TIMER_INTERVAL, new Runnable() { @Override public void run() { //虽然StringBuffer线程安全, //但在读取toString()和setLength(0)清空之间 //存在交错执行的append输入 //所以要锁住防止交错 synchronized(GlobalCall.outputBuffer) { if(GlobalCall.outputBuffer.length() > 0) { logTab.logOutput.append( GlobalCall.outputBuffer.toString()); GlobalCall.outputBuffer.setLength(0); } } display.timerExec(TIMER_INTERVAL, this); } });
另一方面,在后台线程对这个StringBuffer对象执行追加操作
synchronized(outputBuffer) { outputBuffer.append(getTimeString() + str + "\n"); }
如果不加同步锁就会有问题,原因是,在用户界面线程里,append和setLength(0)执行期间,
后台线程可能对这个线程执行append操作。
结果,在此之间执行的append字符串没有来得及显示到界面上,就被setLength(0)删除了。
相关推荐
Java的StringBuffer和StringBuilder类是用于字符串操作的可变字符序列类。本文将介绍Java StringBuffer和StringBuilder类的常见操作和用法,包括创建、追加、插入、删除、替换、反转等操作。我们还会讨论如何获取...
StringBuffer和StringBuilder类的用法基本相同,但StringBuilder类的效率更高,因为它不是线程安全的; 二、StringBuffer的示例 // 创建一个空的StringBuffer对象 StringBuffer sb = new StringBuffer(); // 向...
JAVA的StringBuffer类.docx
java高级特性StringBuffer类.doc
Java中StringBuffer类.pdf 学习资料 复习资料 教学资源
JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据.这个String类提供了数值不可改变的字符串.而这个StringBuffer类提供的字符串进行修改.当你知道字符数据要改变的时候...
StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议...
主要介绍了JAVA StringBuffer类与StringTokenizer类代码解析,具有一定借鉴价值,需要的朋友可以参考下
一、什么是Java中的String类? String类是Java中表示字符串的类。它是不可变的,一旦创建了一个字符串对象,就无法修改它。 二、String类和StringBuilder...StringBuffer是线程安全的,因为它的所有公共方法都是同步的
主要介绍了Java StringBuffer类与StringBuilder类用法,结合实例形式总结分析了Java StringBuffer类与StringBuilder类的功能、原理及添加、删除、替换、截取等操作实现技巧,需要的朋友可以参考下
java基础--4.常用类-3.StringBuffer、StringBuilder
StringBuffer的常用方法实例,如:append、insert等等。其中,StringBuffer与String的区别详细做了例子。
TestStringBuffer验证StringBuffer在多线程下并非线程安全
JAVA常用类,java封装类,String类和StringBuffer类......
主要为大家介绍了java中StringBuffer类常用方法
对于Java中StringBuffer类的有关问题做下的思维导图,便于深化记忆,希望对你有帮助!注意:文件为.mm后缀建议下载freemind打开,免费的思维导图软件!
我们先用一张表格来回顾一下Java中String,StringBuilder,StringBuffer关于值可变性、线程安全性、时间性能排序、常用场景等主要区别。见下表: 数据类型 值可变性 线程安全性 时间性能排名 常用场景 String...
StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程...
Java,StringBuffer,对于初学者会更有用些
主要为大家详细介绍了JAVA中String类与StringBuffer类的区别,具有一定的参考价值,感兴趣的小伙伴们可以参考一下