返回顶部
首页 > 资讯 > 精选 >关于读写锁算法的Java实现及思考是怎么样的
  • 816
分享到

关于读写锁算法的Java实现及思考是怎么样的

2023-06-17 11:06:26 816人浏览 薄情痞子
摘要

本篇文章给大家分享的是有关关于读写锁算法的Java实现及思考是怎么样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。问题背景:多个线程对一个共享的资源进行读写访问。写线程之间需

本篇文章给大家分享的是有关关于读写算法的Java实现及思考是怎么样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

问题背景:多个线程对一个共享的资源进行读写访问。写线程之间需要互斥,读线程跟写线程需要互斥,读线程之间不用互斥。

早些时候听张sir的课,讲述java5中增强并发的功能。用java.util.concurrent.locks中ReadWriteLock 可以轻松解决读写锁问题。我在思考如果没有ReadWriteLock,单靠synchronized可以怎样做呢? 的确,比较麻烦。

结合张sir传授的面向对象的设计思想,首先设计一个业务类Business作为共享资源,封装write跟read方法。

因为write必定互斥,所以直接定义synchronized。

read之间不要互斥 所以read 不能直接定义synchronized的 但是 write跟read 需要互斥 如何控制 我想到的一个方法是在read里 加入synchronized(this){} 同时定义readThreads计数器作为信号量 我试想下会出现下面几种情况:

read[m]表示某个线程的read方法 。

write[n] 同上

1>read[m]中执行到synchronized(this){readThreads++;}时 write[n]来了 write[n] 会被自身的synchronized阻塞。

2>read[m]在do something(此时无锁)时 write[n] 来了 因为 readThreads!=0 而被迫wait。

3> 每次read[m]结束时 wait中的write[n]会被notify 但如果发现还有其他的read的话 write[n] 只能无奈地再次wait。

4>当readThreads==0并且调用notifyAll 时 read[m] 和 write[n] 会竞争cpu 如果write[n]再次落败,则会出现1>或3> ; 如果成了,则如下:

5> 如果write[n] wait中醒来占锁,read[m]被阻塞synchronized(this){readThreads++;}之上。

6>如果被阻塞的write[n]占锁,read[m]被阻塞synchronized(this){readThreads++;}之上。

从以上看来read 和 write 是互斥的。

实现细节如下:<如有错误欢迎指出交流>

package communication;  import java.util.Random;   public class ReadWriteLockTest {          public static void main(String[] args){                  final Business business = new Business();                                    //启动4线程 2读 2写                  for(int i=1;i<=2;i++){                                  new Thread(new Runnable(){                                          public void run() {                                                  for(int j=1;j<1000;j++){                                                          business.read();                                                          try {                                                                  Thread.sleep(900);                                                          } catch (InterruptedException e) {                                                                  e.printStackTrace();                                                          }                                                                                                          }                                                                                  }                                                                  }).start();                                                                    new Thread(new Runnable(){                                          public void run() {                                                  Random r = new Random();                                                  for(int j=1;j<1000;j++){                                                          int i = r.nextInt(100);                                                          business.write(i);                                                          try {                                                                  Thread.sleep(1000);                                                          } catch (InterruptedException e) {                                                                  e.printStackTrace();                                                          }                                                  }                                                                                  }                                                  }).start();                  }                            }            }  //封装的业务类  class Business{          private int data=0; //共享资源属性          private int readThreads = 0; //读线程数          //private boolean isWriting  = false;           //是否执行写 后来发现不需要 当write抢占锁时 所有的read 都被挡在synchronized (this){}之上 无机会执行wait          public void read(){                  synchronized (this) {                                                           //readThreads不被锁的话 会出现read和write不互斥的小概率事件 导致线程不安全                          readThreads++;                                            }                                    System.out.println(Thread.currentThread().getName()+" read begin");                  System.out.println(Thread.currentThread().getName()+" read:"+data);                  System.out.println(Thread.currentThread().getName()+" read finish");                                            synchronized (this) {                          readThreads--;                          this.notifyAll();                  }                  }                    public synchronized void write(int i){                  while(readThreads != 0){//当read 正处于do something状态时 来个write 那就只有等等先了                          try {                                  this.wait();                          } catch (InterruptedException e) {                                  e.printStackTrace();                          }                  }                  //isWriting = true;                  System.out.println(Thread.currentThread().getName()+" write start");                  data = i;                  System.out.println(Thread.currentThread().getName()+" write:"+i);                  System.out.println(Thread.currentThread().getName()+" write over");                  //isWriting = false;                  this.notifyAll();          }  }

思考中:

当读频繁时 readThreads会长时间!= 0 写线程会饿死 这个可以如何解决?

以上就是关于读写锁算法的Java实现及思考是怎么样的,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网精选频道。

--结束END--

本文标题: 关于读写锁算法的Java实现及思考是怎么样的

本文链接: https://lsjlt.com/news/288498.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 关于读写锁算法的Java实现及思考是怎么样的
    本篇文章给大家分享的是有关关于读写锁算法的Java实现及思考是怎么样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。问题背景:多个线程对一个共享的资源进行读写访问。写线程之间需...
    99+
    2023-06-17
  • Java实现读写锁的原理是什么
    本文小编为大家详细介绍“Java实现读写锁的原理是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java实现读写锁的原理是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。读/写锁Java实现首先我们总结一...
    99+
    2023-06-29
  • java读写锁的使用方法是什么
    在Java中,读写锁是一种特殊的锁,允许多个线程同时读取共享资源,但只允许一个线程进行写操作。读写锁通过ReadWriteLock接...
    99+
    2024-04-03
    java
  • Java 并发包中的读写锁及其实现分析
    这期内容当中小编将会给大家带来有关Java 并发包中的读写锁及其实现分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1. 前言在Java并发包中常用的锁(如:ReentrantLock),基本上都是排他...
    99+
    2023-06-17
  • Java利用StampedLock实现读写锁的方法详解
    目录概述StampedLock介绍演示例子性能对比总结概述 想到读写锁,大家第一时间想到的可能是ReentrantReadWriteLock。实际上,在jdk8以后,java提供了一...
    99+
    2022-11-13
    Java StampedLock读写锁 Java StampedLock Java 读写锁
  • 关于Java中如何实现文件的读写操作
    目录文件读取FileInputStream:BufferedReader:文件写入FileOutputStream:PrintWriter:文件复制文件删除文件重命名总结:在Java...
    99+
    2023-05-18
    Java读写 Java文件读写
  • 排序算法及其C实现是怎样的
    这期内容当中小编将会给大家带来有关排序算法及其C实现是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。排序算法(Sorting Algorithm)是计算机算法的一个组成部分。排序的目标是将一组数据 ...
    99+
    2023-06-04
  • Java中关于字典树的算法实现
    字典树(前缀树)算法实现 前言 字典树,又称单词查找树,是一个典型的 一对多的字符串匹配算法。“一”指的是一个模式串,“多”指的是多个模板串。字典树经常被用来统计、排序和保存大量的字...
    99+
    2024-04-02
  • Java实现雪花算法的代码怎么写
    这篇文章主要介绍了Java实现雪花算法的代码怎么写的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java实现雪花算法的代码怎么写文章都会有所收获,下面我们一起来看看吧。一、介绍SnowFlow算法是Twitte...
    99+
    2023-06-29
  • 关于二分法查找Java的实现及解析
    目录二分法查找概述递归实现递归实现代码循环实现代码(非递归)二分法查找(递归、循环)二分法查找 概述 二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。...
    99+
    2024-04-02
  • DB分库分表中关于使用框架还是自主开发以及sharding实现层面的考量是怎样的
    这篇文章将为大家详细讲解有关DB分库分表中关于使用框架还是自主开发以及sharding实现层面的考量是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。当...
    99+
    2024-04-02
  • java实现分布式锁的代码怎么写
    在Java中实现分布式锁可以使用以下几种方式:1. 基于数据库的实现:   - 创建一个数据库表,表中有一个唯一索引字段用...
    99+
    2023-10-23
    java
  • mysql读写分离实现的方法是什么
    MySQL读写分离是通过将读操作和写操作分别分配到不同的MySQL实例上来实现的。 常见的实现方法有以下两种: 通过MySQL代...
    99+
    2024-04-09
    mysql
  • Java中怎么实现文件的读写操作
    在Java中,文件的读写操作可以通过使用Java I/O库来实现。以下是一些常用的方法: 使用FileInputStream和Fi...
    99+
    2024-03-05
    java
  • java乐观锁实现的方法是什么
    在Java中,乐观锁的实现方法可以通过使用版本号机制来实现。具体步骤如下:1. 在数据表中添加一个版本号字段,通常为一个整数类型的字...
    99+
    2023-10-11
    java
  • java实现计算器的代码怎么写
    以下是一个简单的Java代码实现计算器的示例:```javaimport java.util.Scanner;public class Calculator {public static void main(String[] args)...
    99+
    2023-08-11
    java
  • Java中关于OOM的场景及解决方法是什么
    这期内容当中小编将会给大家带来有关Java中关于OOM的场景及解决方法是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。OOM for Heap=>例如:java.lang.OutOfMemory...
    99+
    2023-06-17
  • XP系统出现内存读写错误的解决方法是怎样的
    XP系统出现内存读写错误的解决方法是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。当我们在计算机系统中运行一些容量较大的程序或者游戏时,系统常常会自动弹出“xx内存不能为...
    99+
    2023-06-14
  • Java实现马踏棋盘游戏算法的代码怎么写
    这篇文章主要介绍“Java实现马踏棋盘游戏算法的代码怎么写”,在日常操作中,相信很多人在Java实现马踏棋盘游戏算法的代码怎么写问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java实现马踏棋盘游戏算法的代码...
    99+
    2023-06-29
  • Java排序算法实现的方法是什么
    这篇文章主要介绍“Java排序算法实现的方法是什么”,在日常操作中,相信很多人在Java排序算法实现的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java排序算法实现的方法是什么”的疑惑有所帮助!...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作