文章原址
https://blog.csdn.net/zcw4237256/article/details/79067892
下面是测试类
[java] view plain copy
public class Mythread implements Runnable {
@Override
public void run() {
Single single = Single.getInstance();
String name = Thread.currentThread().getName();
single.sbf = new StringBuffer();
try {
Thread.sleep(2000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
single.sbf.append("put name " + name + " ");
System.out.println(name + " : " + single.sbf.toString());
}
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
new Thread(new Mythread()).start();
}
}
}
红色部分便是 出现线程不安全的部分 (多个线程都在执行这部分 而单例对象只有一个的情况)
StringBuffer 只能保证的是自己有synchronized的部分方法串行化执行
并是你使用就会串行化 需要结合场景使用随
synchronized(single){
single.sbf = new StringBuffer();
try {
Thread.currentThread();
Thread.sleep(2000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
single.sbf.append("put name " + name + " ");
System.out.println(name + " : " + single.sbf.toString());
}
之后作者锁住 single 类 保证了此段代码的串行化执行