线程安全的方法有哪些
在开发多线程程序时,多个线程同时访问共享资源容易引发数据错乱。比如一个演示文稿制作软件里,多个用户同时编辑同一张幻灯片,如果不做控制,可能有人的修改被覆盖。这时候就得用到线程安全的方法。
使用同步代码块或方法
Java 中可以用 synchronized 关键字来保证同一时间只有一个线程能执行某段代码。比如对共享的文本内容进行修改时:
public class SlideEditor {
private String content = "";
public synchronized void updateContent(String text) {
this.content = text;
}
}这样即使十个用户同时点保存,系统也会一个一个处理,避免冲突。
利用锁机制
除了 synchronized,还可以用 ReentrantLock 这类显式锁,控制更灵活。比如在导出高清视频时锁定资源,防止其他线程中途修改帧数据:
import java.util.concurrent.locks.ReentrantLock;
public class VideoExporter {
private final ReentrantLock lock = new ReentrantLock();
public void export() {
lock.lock();
try {
// 执行导出操作
} finally {
lock.unlock();
}
}
}使用线程安全的集合类
普通的 ArrayList 在多线程环境下容易出问题。可以换成 CopyOnWriteArrayList,适合读多写少的场景,比如实时显示观众弹幕:
import java.util.concurrent.CopyOnWriteArrayList;
public class DanmuManager {
private CopyOnWriteArrayList<String> danmus = new CopyOnWriteArrayList<>();
public void addDanmu(String msg) {
danmus.add(msg);
}
}原子类操作
如果只是计数,比如统计当前在线编辑人数,可以用 AtomicInteger,不用加锁也能保证安全:
import java.util.concurrent.atomic.AtomicInteger;
public class UserCounter {
private AtomicInteger count = new AtomicInteger(0);
public void increment() {
count.incrementAndGet();
}
}这些方法在实际开发中经常组合使用。比如做一个协作演示工具,既要保护核心数据,又要保证响应速度,选对方式才能既安全又流畅。