BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #35008同步于 2014/9/29
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

StringBuilder不执行同步是什么意思?

slkobe
2014/9/29镜像同步11 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
lixing机器人#1 · 2014/9/29
例如在A类调用了StringBuilder引用的append方法,B类也调用了同样StringBuilder的引用的append方法,然后A类和B类中的StringBuilder.toString()方法会返回不同值?不知道是不是这样
HB0318机器人#2 · 2014/9/29
ls说的对,stringbuilder是非线程安全的,多个线程同时对它进行操作,可能会造成错误,可能会取到不同的值,删掉不想删的值。如果多线程操作,使用stringbuffer。
slkobe机器人#3 · 2014/9/29
非常感谢,再问一个问题,A是父类,B是子类,执行B的有参的构造函数,是不是会自动在里面加上super();
lixing机器人#4 · 2014/9/29
【 在 slkobe 的大作中提到: 】 : 非常感谢,再问一个问题,A是父类,B是子类,执行B的有参的构造函数,是不是会自动在里面加上super(); 会的。子类的构造函数会默认先调用父类的构造函数。
slkobe机器人#5 · 2014/9/29
再次感谢版主!!!
slkobe机器人#6 · 2014/9/29
package com.test; public class LearnStringBuilder { StringBuilder sb = new StringBuilder("abc"); public static void main(String[] args) { C c = new C(); Thread t1 = new Thread(c); t1.start(); D d = new D(); Thread t2 = new Thread(d); t2.start(); } } class C implements Runnable{ public void run() { LearnStringBuilder lsb = new LearnStringBuilder(); while (true){ lsb.sb.append('c'); System.out.println(lsb.sb.toString()); } } } class D implements Runnable{ public void run() { LearnStringBuilder lsb = new LearnStringBuilder(); while(true){ lsb.sb.append('d'); System.out.println(lsb.sb.toString()); } } } 但是没有出现线程不安全问题啊,和StringBuffer一样。不知道是不是哪里理解错了。
lixing机器人#7 · 2014/9/29
【 在 slkobe 的大作中提到: 】 : package com.test; : public class LearnStringBuilder { : StringBuilder sb = new StringBuilder("abc"); : ................... 你的类C和类D的StringBuilder不是同一个引用。 另外我不是这个版的版主。。
lixing机器人#8 · 2014/9/29
【 在 slkobe 的大作中提到: 】 : package com.test; : public class LearnStringBuilder { : StringBuilder sb = new StringBuilder("abc"); : ................... 要测试的话应该是下面这样,但是我也对结果表示不结~ public class LearnStringBuilder { public StringBuilder sb = new StringBuilder("abc"); public static void main(String[] args) { LearnStringBuilder lsb = new LearnStringBuilder(); C c = new C(lsb); Thread t1 = new Thread(c); t1.start(); D d = new D(lsb); Thread t2 = new Thread(d); t2.start(); E e = new E(lsb); Thread t3 = new Thread(e); t3.start(); } } class C implements Runnable { LearnStringBuilder lsb; public C(LearnStringBuilder lsb){ this.lsb = lsb; } public void run() { while (true) { lsb.sb.append('c'); System.out.println("Class C:"+lsb.sb.toString()); } } } class D implements Runnable { LearnStringBuilder lsb; public D(LearnStringBuilder lsb){ this.lsb = lsb; } public void run() { while (true) { lsb.sb.append('d'); System.out.println("Class D:"+lsb.sb.toString()); } } } class E implements Runnable { LearnStringBuilder lsb; public E(LearnStringBuilder lsb){ this.lsb = lsb; } public void run() { while (true) { lsb.sb.deleteCharAt(lsb.sb.length()-1); System.out.println("Class E:"+lsb.sb.toString()); } } }
slkobe机器人#9 · 2014/9/29
多谢提醒,犯了个低级失误,我在网上先找找看有没有其他的例子。