1.死锁
所有线程都被阻塞,这样的状态称为死锁。Java编程语言中没有任何东西可以避免或打破这种死锁现象。必须仔细设计程序,以确保不会出现死锁。
2.线程局部变量
有时候为了避免在线程中共享变量,可以使用ThreadLocal辅助类为各个线程提供各自的实例。
//创建一个线程局部变量,其初始值通过调用给定的supplier生成。
static <S> ThreadLocal<S> withInitial(Supplier<? extends S> supplier)
3.锁测试
tryLock方法试图申请一个锁,在成功获得锁后返回true,否则,立即返回false,而且线程可以立即离开去做其他事情。
if (myLock.tryLock()) {
//now the thread owns the lock
try{...}
finally{myLock.unlock();}
} else
//do something else
4.读/写锁
如果很多线程从一个数据结构读取数据,而很少线程修改其中数据,这时使用ReentrantReadWriteLock类是很有必要的。在这种情况下,允许多个读操作共用一个读锁是合适的。写者线程依然必须是互斥访问的。
下面是使用读/写锁的必要步骤:
1.构造一个ReentrantReadWriteLock对象:
private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
2.抽取读锁和写锁:
//得到一个可以被多个读操作共用的读锁,但会排斥所有写操作
private Lock readLock = rwl.readLock();
//得到一个写锁,排斥所有其他的读操作和写操作
private Lock writeLock = rwl.writeLock();
3.对所有的获取方法加读锁:
public double getTotalBalance() {
readLock.lock();
try{...};
finally{readLock.unlock();}
}
4.对所有的修改方法加锁:
public void transfer(...) {
writeLock.lock();
try{...}
finally{writeLock.unlock();}
}
网友评论