StringBuilder和StringBuffer的线程安全性的源码级理解(JDK14)

您所在的位置:网站首页 stringbuilder线程不安全 StringBuilder和StringBuffer的线程安全性的源码级理解(JDK14)

StringBuilder和StringBuffer的线程安全性的源码级理解(JDK14)

2024-07-05 00:30| 来源: 网络整理| 查看: 265

目录 前言源码分析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