[TOC]一、ReentrantLock可重入锁ReentrantLock是一种互斥锁,即同一时刻只有一个线程可以获取加锁的资源,并执行加锁的范围内的代码。这与synchronized关键字非常相似。它的基本使用代码如下:Locklock=newReentrantLock();//实例化锁//lock.lock();//锁booleanlocked=lock.tryLock();//尝试加锁if(locked){try{//加锁的同步代码块只能同时被一个线程执行}finally{lock.unlock();//放在finally代码块中,保证一定会释放锁}}通过lock函数获取锁,通过unlock函数释放锁。将需要同步执行的代码放到try/finally代码块中,在finally中释放锁,这一点很重要。ReentrantLock是可重入锁,即(lock/unlok)动作可以嵌套(lock/unlock),同一个锁可以嵌套多次使用,不会死锁。但是lock函数和unlock函数在代码中必须成对出现,否则会出现死锁。2.ReentrantReadWriteLock读写锁ReentrantReadWriteLock类是读写锁的实现类。对于某个对象或变量变量,只要没有线程在修改它,这个对象或变量变量是可以同时被多个线程读取的。ReentrantReadWriteLock将锁分为读锁和写锁。只要没有线程持有写锁,读锁就可以同时被多个线程持有。读锁-如果没有线程获取或请求写锁,那么多个线程可以获得读锁写锁-如果没有线程在读或写,那么只有一个线程可以获得写锁简单来说,ReentrantReadWriteLock可以保证有最多一个线程同时写数据,或者多个线程同时读数据。因此,在读操作比写操作频繁的情况下,使用ReentrantReadWriteLock可以提高程序的性能和吞吐量。下面用一个简单的例子来说明如何应用读写锁。publicclassTestReadWriteLock{//可同时执行3个线程任务的线程池ExecutorServiceexecutor=Executors.newFixedThreadPool(3);//读写目标,写线程将数据放入map,读线程从map中读取数据Mapmap=newHashMap<>();//读写锁操作对象ReadWriteLocklock=newReentrantReadWriteLock();//写操作函数publicvoidwrite(){executor.submit(()->{//线程池提交写操作任务lock.writeLock().lock();//添加写锁try{map.put("key","val");//写数据操作Thread.sleep(2000);}catch(InterruptedExceptione){e.printStackTrace();}finally{lock.writeLock().unlock();//释放写锁}});}//读操作函数publicvoidread(){lock.readLock().锁();//添加读锁System.out.println(Thread.currentThread().getName()+"添加读锁");尝试{System.out.println(map.get("key"));//读数据操作}finally{lock.readLock().unlock();//释放读锁System.out.println(Thread.currentThread().getName()+"释放读锁");}}}3.读锁不互斥。让我们编写一个测试方法,通过打印输出来了解读写锁控制代码的执行顺序。//测试publicstaticvoidmain(String[]args){TestReadWriteLocktest=newTestReadWriteLock();测试.write();//提交一个写操作任务,写入一条数据RunnablereadTask=test::read;//线程方法read,实现线程Runnable接口的简单方法test.executor.submit(readTask);//读取1次(新的读取线程)test.executor.submit(readTask);//读取2次(新的读取线程)test.executor.shutdown();}执行以上代码,可能会出现如下输出pool-1-thread-2addsreadlockpool-1-thread-3addsreadlockvalvalpool-1-thread-3releasesreadlockpool-1-thread-2releasesread当pool-1-thread-2没有释放读锁时,pool-1-thread-3可以重新加读锁,正确读取数据val。说明读锁不是互斥的。但是当执行读操作时(读锁生效),不能执行写操作(无法获取写锁),所以ReentrantReadWriteLock不支持同时加读锁和写锁。这个结论我可以很负责任的告诉你,这里就不做验证了!欢迎关注我的博客,本文转载更多优质知识合集,注明出处(一定要有链接,不能只是文字):字母哥博客-zimug.com如果觉得对你有帮助,请点赞分享!您的支持是我创作不竭的动力!.另外,作者近期输出了以下优质内容,期待大家的关注。《kafka修炼之道》《手摸手教你学Spring Boot2.0》《Spring Security-JWT-OAuth2一本通》《实战前后端分离RBAC权限管理系统》《实战SpringCloud微服务从青铜到王者》