线程局部变量
当某个 class 不是线程安全的时候,那么可以通过 ThreadLocal 辅助类来让每个线程都构造自己的这个 class 的实例。
比如 SimpleDateFormat 不是线程安全的,那么可以使用如下方式:
public static final ThreadLocal dateFormat =
ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd"));
访问具体方法时使用:
String dateStamp = dateFormat.get().format(new Date());
第一次调用 get 方法时,会调用上面的 initialValue
方法,在此之后,get 方法会返回属于当前线程的那个实例。
每个线程独立的随机数生成器
java.util.Random 是线程安全的,但是如果多个线程需要等待一个共享的随机数生成器就会很慢。
除了使用上面 ThreadLocal 的方式来解决问题,还可以使用一个 Java SE 7 提供的便利类:
int random = ThreadLocalRandom.current().nextInt();
读写锁
使用方式:
private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
private Lock readLock = rwl.readLock();
private Lock writeLock = rwl.writeLock();
readLock.lock();
readLock.unlock();
writeLock.lock();
writeLock.unlock();