假设有两个线程Thread-0和Thread-1同时操作对象StringBuilder。
//线程任务类
class SBTask implements Runnable{
static final StringBuilder sb = new StringBuilder();
//为了方便理解,加入了一个可变参数
int tmp = 1;
//实现run方法
public void run(){
sb.append(count++);
}
}
SBTask st = new SBTask();
Thread t0 = new Thread(st);
Thread t1 = new Thread(st);
假设t0进入任务,操作完成后,sb 变成了1
然后还是t0 执行,当t0进入线程任务后,t1也进来了。
这个时候可能t0就让出了执行权,交给了t1,t1执行后,sb变成了12
又将执行权交给了t0,t0接着之前的位置执行,t0执行完就变成122. //这里就出现了线程问题
用StringBuffer 一定不会出现重复的 |