- 减少同步范围:
- 原理:StringBuffer内部方法大多是同步的,若能缩小同步代码块范围,可减少线程等待时间,提升性能。
- 示例:
StringBuffer sb = new StringBuffer();
// 错误方式,整个方法同步,所有操作都串行
public synchronized void badAppend(String str) {
sb.append(str);
}
// 优化方式,只对关键代码同步
public void goodAppend(String str) {
synchronized (sb) {
sb.append(str);
}
}
- 预分配足够容量:
- 原理:StringBuffer扩容时会进行内存复制等操作,开销较大。预先设置合适容量可减少扩容次数,提升性能。
- 示例:
// 假设已知要拼接的字符串大概长度为1000
StringBuffer sb = new StringBuffer(1000);
for (int i = 0; i < 100; i++) {
sb.append("a");
}
- 批量操作:
- 原理:减少频繁的方法调用和同步操作,将多个小操作合并为一个大操作,减少同步次数。
- 示例:
StringBuffer sb = new StringBuffer();
// 普通方式,多次调用append,多次同步
sb.append("hello");
sb.append(" ");
sb.append("world");
// 批量操作方式,一次同步
String temp = "hello world";
sb.append(temp);
- 使用StringBuilder替代(读多写少场景):
- 原理:在高并发读多写少场景下,StringBuilder是非线程安全的,但性能更高。可使用读写锁(ReadWriteLock)来保证线程安全,这样读操作可并发执行,提升性能。
- 示例:
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
class SafeStringBuilder {
private final StringBuilder sb = new StringBuilder();
private final ReadWriteLock lock = new ReentrantReadWriteLock();
public String read() {
lock.readLock().lock();
try {
return sb.toString();
} finally {
lock.readLock().unlock();
}
}
public void write(String str) {
lock.writeLock().lock();
try {
sb.append(str);
} finally {
lock.writeLock().unlock();
}
}
}