读写锁的实现,实现一个读写锁

  读写锁的实现,实现一个读写锁

  如何解决写爬虫IP受阻的问题?立即使用。

  我们知道多线程同时读取一个资源类是没有问题的,所以在并发的情况下,同时读取共享资源应该是可以的;但是,如果一个线程想要写入共享资源,则其他线程不应该同时读取或写入共享资源。

  (推荐教程:java入门)

  我们想要的:允许多个线程同时读取,但是只要一个线程在写,其他线程就必须等待。

  读写锁是原理,即读写锁可以允许多个线程同时访问,但是当写线程访问时,所有的读线程和其他写线程都会被阻塞。读写锁实际上维护一对锁,一个读锁和一个写锁。通过将读锁和写锁分离,其并发性相比独占锁(exclusive locks)有了很大的提高。

  代码示例:

  公共类ReadWriteLockDemo {

  公共静态void main(String[] args) {

  read write lock read write lock=new reentrantreadwritellock();

  Book book=新书();//创建一本可读写的书

  //两个编写器

  for(int I=0;I 2;i ) {

  int num=I;

  新线程(()-{

  尝试{

  readWriteLock.writeLock()。lock();

  System.out.println (Writer num 正在写文章);

  book.write(String.valueOf(num),UUID.randomUUID()。toString()。substring(0,5));

  }catch(异常e){

  e . printstacktrace();

  }最后{

  readWriteLock.writeLock()。unlock();

  }

  },String.valueOf(i))。start();

  }

  //6个阅读器

  for(int I=0;i6;i ) {

  int num=I;

  新线程(()-{

  尝试{

  readWriteLock.readLock()。lock();

  string word=book . read(string . value of(num % 2));

  System.out.println (reader num 正在阅读一篇文章.word);

  } catch(异常e) {

  e . printstacktrace();

  }最后{

  readWriteLock.readLock()。unlock();

  }

  },String.valueOf(i))。start();

  }

  }

  }

  课堂用书{

  HashMapString,String map=new HashMap();

  public void write(String key,String val){

  map.put(key,val);

  }

  公共字符串读取(字符串密钥){

  string word=map . get(key);

  返回单词;

  }

  }输出结果:

  C:\ Program Files \ Java \ JDK 1 . 8 . 0 _ 144 \ bin \ Java . exe -Java agent:F:\ MyDir \ IDEA \ IDEA 2018 \ IntelliJ IDEA 2018 . 2 . 4 \ lib \ IDEA _ rt . jar=54141:F:\ MyDir \ IDEA \ IDEA 2018 \ IntelliJ IDEA 2018 . 2 . 4 \ bin -dfile . encoding=UTF-8-class path C:\ Program Files \ Java \ JDK 1 . 8 . 0 _ 1c:\ Program Files \ Java \ JDK 1 . 8 . 0 _ 144 \ JRE \ lib \ ext \ nashorn . jar;c:\ Program Files \ Java \ JDK 1 . 8 . 0 _ 144 \ JRE \ lib \ rt . jar;e:\ idea _ workplace \ Java base \ target \ classes

  作家0正在写文章。

  作家1正在写一篇文章。

  0读者正在阅读文章.6b021

  1读者正在阅读这篇文章.220e4

  2读者正在阅读这篇文章.6b021

  4读者正在阅读这篇文章.6b021

  3读者正在阅读这篇文章.220e4

  5位读者正在阅读这篇文章.220e4

  用退出代码0读写锁完成的进程的效率

  (视频教程推荐:java视频教程)

  读写锁能否提高互斥锁的性能取决于数据被读取和修改的频率、读写操作的持续时间、数据争用以及同时尝试读取或写入数据的线程数量。

  例如,最初填充数据集然后经常被修改的频繁搜索(例如,某种目录)是使用读写锁的理想选择。但是,如果更新变得频繁,数据大部分时间会被特别锁定,并发性增加很少。

  此外,如果读取操作太短,读写锁定实现的开销(比互斥锁更复杂)可能会主导执行成本,尤其是因为许多读写锁定实现仍然会通过一小部分代码序列化所有线程。最终,只有分析和测量才能确定使用读写锁是否适合您的应用程序。这就是读写锁是什么的细节。更多请关注我们的其他相关文章!

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

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