Java reentrantlock,java reentrantreadwritelock

  Java reentrantlock,java reentrantreadwritelock

  00-1010 I、ReentrantLock重入锁II、ReentrantReadWriteLock读写锁III、读锁不互斥。

  00-1010 ReentrantLock是一个互斥锁,即只有一个线程可以同时获取锁定的资源和执行锁定范围内的代码。这与synchronized关键字非常相似。其基本使用代码如下:

  lock lock=new reentrant lock();//实例化锁//lock . lock();//Lock boolean locked=Lock . try Lock();//Try lock if(locked){ Try {//锁定的同步代码块,同一时间只能有一个线程执行} finally { lock . unlock();//放到finally代码块中,保证锁会被释放}}通过lock函数获取锁,通过unlock函数释放。把需要同步执行的代码放到try/finally代码块中,最后释放锁,这一点非常重要。ReentrantLock是可重入锁,即:(lock/unlok)动作里面可以嵌套(lock/unlock),针对同一个锁可以多次嵌套使用,不会产生死锁。但是lock函数与unlock函数在代码中必须成对出现,否则会出现死锁.

  

目录

ReentrantReadWriteLock类是一个读写锁实现类,只要没有线程在修改它,就可以被多个线程同时读取。ReentrantReadWriteLock将锁分为读锁和写锁。只要没有线程持有写锁,读锁就可以被多个线程同时持有。

 

  读锁-If没有线程获取或请求写锁,则多个线程可以获取读锁写锁-If没有线程正在读取或写入,则只有一个线程可以获取写锁简单的说就是ReentrantReadWriteLock可以保证最多同时有一个线程在写数据,或者可以同时有多个线程读数据。因此使用ReentrantReadWriteLock,在读操作比写操作更频繁的情况下,可以提高程序的性能和吞吐量。.

  让我们用一个简单的例子来解释如何应用读写锁。

  classtestreadwritelock {//可以同时执行三个线程任务的线程池executorserviceexecutor=executors . newfixedthreadpool(3);//读写目标,写线程将数据放入map,读线程从map中读取数据mapstring,string map=new hashmap();//读写锁操作对象read write lock=new reentrantreadwritelock();//写操作函数public void Write(){ executor . submit()-{//线程池提交写操作任务lock.writeLock()。lock();//添加写锁try {map.put(key , val );//写数据操作thread . sleep(2000);} catch(interrupted exception e){ e . printstacktrace();}最后是{ lock.writeLock()。unlock();//释放写锁} });}//读取操作函数public void read () {lock.readlock()。lock();//读取lock system . out . println(thread . current thread()。getname() read lock );试试{ system . out . println(map . get( key ));//读取数据操作}最后{lock.readlock()。unlock();//释放读锁system . out . println(thread . current thread()。getname()释放读锁);} }}

  00-1010我们编写一个测试方法,通过打印输出来了解读写锁控制代码的执行顺序。

  //test公共静态void main(string[]args){ testreadwritelock test=newtestreadwritelock();test . write();//提交写操作任务,写一条数据Runnable read task=test 33603360 read;//Thread方法read,为Thread的Runnable接口编写test.executor.submit(readTask)的简单方法;//Read once(新读取线程)test . executor . submit(Read task);//读取2次(新读取线程)test . executor . shut down();}执行上述代码,可能会出现以下输出

  池-1-线程-2读锁池-1-线程-3读锁值池-1-线程-3释放读锁池-1-线程-2释放读锁

  在pool-1-thread-2不释放读锁的情况下,pool-1-thread-3可以再次添加读锁,并且都正确读取数据val。说明读锁之间是不互斥的.但是,我可以负责任的告诉你在进行读操作(读锁生效)的时候,写操作是无法进行的(无法获取写锁),所以ReentrantReadWriteLock不支持同时加读锁和写锁。的这个结论,这里就不验证了!

  这就是这篇关于java并发编程中的ReentrantLock的文章。关于Java中可重入锁的更多信息,请搜索以前关于流行它的文章,或者继续浏览下面的相关文章。我希望你能在未来更多地支持它!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: