Java 多线程之 Lock 的使用

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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值