[笔记] Java 并发相关

By | 12 11 月, 2017

线程局部变量

当某个 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();

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注