Java多线程之Lock的使用(二)
类ReentrantLock具有完全互斥排他的效果,即同一时间只有一个线程在执行ReentrantLock.lock()方法后面的任务。这样做虽然保证了实例变量的线程安全性,但效率却是非常低下的。所以在JDK中提供了一种读写锁ReentrantReadWriteLock类,使用它可以加快运行速率,在某些不需要操作实例变量的方法中,完全可以使用读写锁ReentrantReadWriteLock来提升该方法的代码运行速度。
读写锁表示也有两个锁,一个是读操作相关的锁,也称为共享锁;另一个是写操作相关的锁,也叫排他锁。多个读锁之间不互斥,读锁与写锁互斥,写锁与写锁互斥。在没有线程Thread进行写入操作时,进行读取操作的多个Thread都可以获取读锁,而进行写入操作的Thread只有在获取写锁才能进行写入操作。即多个Thread可以同时进行读取操作,但是同一时刻只允许一个Thread进行写入操作。
如何使用
class Service {
private var lock: ReentrantReadWriteLock = ReentrantReadWriteLock()
fun read() {
try {
try {
lock.readLock().lock()
println("获得此锁:${Thread.currentThread().name} ${System.currentTimeMillis()}")
Thread.sleep(10000)
} finally {
lock.readLock().unlock()
}
} catch(e: InterruptedException) {
e.printStackTrace()
}
}
}上面代码显使用了读锁,相应的,写锁应该是:
lock.writeLock().lock()
lock.writeLock().unlock()