返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #35008同步于 2014/9/29
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
StringBuilder不执行同步是什么意思?
slkobe
2014/9/29镜像同步11 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
例如在A类调用了StringBuilder引用的append方法,B类也调用了同样StringBuilder的引用的append方法,然后A类和B类中的StringBuilder.toString()方法会返回不同值?不知道是不是这样
ls说的对,stringbuilder是非线程安全的,多个线程同时对它进行操作,可能会造成错误,可能会取到不同的值,删掉不想删的值。如果多线程操作,使用stringbuffer。
【 在 slkobe 的大作中提到: 】
: 非常感谢,再问一个问题,A是父类,B是子类,执行B的有参的构造函数,是不是会自动在里面加上super();
会的。子类的构造函数会默认先调用父类的构造函数。
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一样。不知道是不是哪里理解错了。
【 在 slkobe 的大作中提到: 】
: package com.test;
: public class LearnStringBuilder {
: StringBuilder sb = new StringBuilder("abc");
: ...................
你的类C和类D的StringBuilder不是同一个引用。
另外我不是这个版的版主。。
【 在 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());
}
}
}