StringBuilder和StringBuffer的线程安全性的源码级理解(JDK14) |
您所在的位置:网站首页 › stringbuilder线程不安全 › StringBuilder和StringBuffer的线程安全性的源码级理解(JDK14) |
目录
前言源码分析StringBuilderStringBuffer
测试测试StringBuilder测试StringBuffer
前言
众所周知,StringBuilder是线程不安全的,StringBuffer是线程安全的。他们底层是怎么实现的呢?他们又为什么是线程不安全与线程安全的呢?今天我们从源码层面分析一下。 源码分析StringBuilder和StringBuffer都是继承自AbstractStringBuilder这个抽象类,他们都重写了AbstractStringBuilder的append方法 StringBuilder @Override @HotSpotIntrinsicCandidate public StringBuilder append(String str) { super.append(str); return this; } StringBuffer @Override @HotSpotIntrinsicCandidate public synchronized StringBuffer append(String str) { toStringCache = null; super.append(str); return this; }可以看出StringBuffer在append方法前面加了synchronized,把他变成了一个同步方法。线程之间需抢占,因此线程安全。但是效率也就低了。 再来看看是什么导致了StringBuilder的线程不安全。我们来进入父类AbstractStringBuilder,看看这个append public AbstractStringBuilder append(String str) { if (str == null) { return appendNull(); } int len = str.length(); ensureCapacityInternal(count + len); putStringAt(count, str); count += len; return this; }问题出在这两行 ensureCapacityInternal(count + len); putStringAt(count, str);ensureCapacityInternal() 这是一个扩容方法。 private void ensureCapacityInternal(int minimumCapacity) { // overflow-conscious code int oldCapacity = value.length >> coder; if (minimumCapacity - oldCapacity > 0) { value = Arrays.copyOf(value, newCapacity(minimumCapacity) |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |