【发布时间】:2014-02-03 13:43:07
【问题描述】:
假设我有一个类,其中有一个 StringBuffer 声明为成员变量。两个线程正在尝试像下面这样操作对象
public class SomeService {
private StringBuffer sb = new StringBuffer();
public void printName(String name) {
sb.append(name);
System.out.println(sb);
}
}
public class StringBufferSynchronizationTest implements Runnable {
private SomeService service = new SomeService();
public StringBufferSynchronizationTest() {
Thread thread = new Thread(this);
thread.start();
}
public static void main(String[] args) {
new StringBufferSynchronizationTest().service.printName("oops");
}
@Override
public void run() {
service.printName("java");
}
}
我得到了这个输出
oopsjava
oopsjava
我以为我会得到
oops
oopsjava
作为输出。当我同步 printName 方法时,我得到了第二个输出。
所以我明白,即使我使用同步类,我也必须同步使用同步类的块/方法。我说的对吗?
【问题讨论】:
-
是的,你必须使用同步方法
-
首先你必须知道你想要什么,然后你开始思考如何得到它。
StringBuffer上的每个方法调用都是自己同步的,这显然与单独方法调用的交错无关。 -
我相信如果你运行足够多次,你最终会得到预期的输出。这是一个竞争条件。
-
那么同步 StringBuffer 有什么用。我可以在我的代码中同步块/方法。是一样的吧?
-
@Cruncher 是的,我也相信这一点。但我总是希望输出类似于第二个的输出。
标签: java multithreading synchronization