读者-写入锁(Readers-WriterLock),顾名思义,就是一种锁,分为读锁和写锁两部分。读锁允许多个线程同时获取,因为读操作本身是线程安全的,而写锁是互斥锁,不允许多个线程同时获取写锁,写操作和读操作也是互斥的。总结一下,读写锁的特点是:读和读不互斥,读和写互斥,写和写互斥。1.Java语言中使用了读写锁。读写锁使用ReentrantReadWriteLock类实现,其中:ReentrantReadWriteLock.ReadLock代表读锁,提供lock方法用于加锁,unlock方法用于解锁。ReentrantReadWriteLock.WriteLock代表一个写锁,提供lock方法进行加锁,unlock方法进行解锁。它的基本使用如下代码所示://创建一个读写锁finalReentrantReadWriteLockreadWriteLock=newReentrantReadWriteLock();//获取一个读锁finalReentrantReadWriteLock.ReadLockreadLock=readWriteLock.readLock();//获取一个写锁lockfinalReentrantReadWriteLock.WriteLockwriteLock=readWriteLock.writeLock();//读锁使用readLock.lock();try{//业务代码...}finally{readLock.unlock();}//写锁使用writeLock。lock();try{//业务代码...}finally{writeLock.unlock();}1.1读与读不互斥多个线程可以同时获取读锁,称为读与读不互斥互斥,如下代码所示://创建读写锁finalReentrantReadWriteLockreadWriteLock=newReentrantReadWriteLock();//创建读写锁finalReentrantReadWriteLock.ReadLockreadLock=readWriteLock.readLock();Threadt1=newThread(()->{readLock.lock();try{System.out.println("[t1]获得了读锁。");线程.睡眠(3000);}catch(InterruptedExceptione){e.printStackTrace();}finally{System.out.println("[t1]释放读锁。");readLock.unlock();}});t1.start();Threadt2=newThread(()->{readLock.lock();try{System.out.println("[t2]获得了读锁。");线程.睡眠(3000);}catch(InterruptedExceptione){e.printStackTrace();}最后{System.out。println("[t2]释放读锁。");readLock.unlock();}});t2.开始();上面程序的执行结果如下:1.2读写互斥同时使用读锁和写锁是互斥的(即不能同时获得),这叫做读写互斥,如下代码所示://创建一个读写锁finalReentrantReadWriteLockreadWriteLock=newReentrantReadWriteLock();//创建一个读写锁finalReentrantReadWriteLock.ReadLockreadLock=readWriteLock.readLock();//创建一个写lockfinalReentrantReadWriteLock.WriteLockwriteLock=readWriteLock.writeLock();//使用读锁Threadt1=newThread(()->{readLock.lock();try{System.out.println("[t1]gotthe读锁。");Thread.sleep(3000);}catch(InterruptedExceptione){e.printStackTrace();}finally{System.out.println("[t1]释放读锁。");readLock.unlock();}});t1.start();//使用写锁Threadt2=newThread(()->{writeLock.lock();try{System.out.println("[t2]getswrit十锁定。”);Thread.sleep(3000);}catch(InterruptedExceptione){e.printStackTrace();}finally{System.out.println("[t2]释放写锁。");writeLock.unlock();}});t2.start();上面程序的执行结果如下:1.3写-写互斥多个线程同时使用写锁时也是互斥的,称为写-写互斥排除,如下代码所示://创建读写锁finalReentrantReadWriteLockreadWriteLock=newReentrantReadWriteLock();//创建写锁finalReentrantReadWriteLock.WriteLockwriteLock=readWriteLock.writeLock();Threadt1=newThread(()->{writeLock.lock();try{System.out.println("[t1]获得写锁。");Thread.sleep(3000);}catch(InterruptedExceptione){e.printStackTrace();}finally{System.out.println("[t1]释放写锁。");writeLock.unlock();}});t1.start();Threadt2=newThread(()->{writeLock.lock();try{System.out.println("[t2]获取令状电子锁。”);线程.睡眠(3000);}catch(InterruptedExceptione){e.printStackTrace();}finally{System.out.println("[t2]释放写锁.");writeLock.unlock();}});t2.start();上面程序的执行结果如下:2.优势分析提高程序执行性能:可以同时执行多个读锁.不管怎样,都要排队执行读写锁提高程序的执行性能,避免读取临时数据:读锁和写锁互斥,排队执行,保证了读操作不会读并且写入了一半的临时数据。三、适用场景读写锁适用于读多写少的业务场景,这时候读写锁的优势最大,综上所述,读写锁就是一个锁分为读锁和写锁两部分,读锁允许多个线程同时获取,而写锁是互斥锁,它的完整规则是:读和读不互斥,读和写是互斥的,而write和write是互斥的。适用于多读业务场景。使用它可以有效的提高程序的执行性能,也可以避免读取到半操作的临时数据。
