返回顶部
首页 > 资讯 > 精选 >Java多线程中读写锁分离设计模式怎么用
  • 877
分享到

Java多线程中读写锁分离设计模式怎么用

2023-06-25 11:06:15 877人浏览 安东尼
摘要

小编给大家分享一下Java多线程中读写锁分离设计模式怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!主要完成任务:read read 并行化read writ

小编给大家分享一下Java多线程中读写分离设计模式怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

主要完成任务:

  • read read 并行化

  • read write 不允许

  • write write 不允许

public class ReaderWorker extends Thread {    private final SharedData data;    public ReaderWorker(SharedData data) {        this.data = data;    }    @Override    public void run() {        while (true) {            try {                char[] readBuf = data.read();                System.out.println(Thread.currentThread().getName() + " reads " + String.valueOf(readBuf));            } catch (InterruptedException e) {                e.printStackTrace();            }        }    }}
public class ReadWriteLock {        private int readingReaders = 0;        private int waitingReaders = 0;        private int writingWriters = 0;        private int waitingWriters = 0;        private boolean preferWriter = true;    public ReadWriteLock() {        this(true);    }    public ReadWriteLock(boolean preferWriter) {        this.preferWriter = preferWriter;    }    public synchronized void readLock() throws InterruptedException {        this.waitingReaders++;        try {                        while (writingWriters > 0||(preferWriter&&waitingWriters>0)) {                this.wait();            }            this.readingReaders++;        } finally {            this.waitingReaders--;        }    }    public synchronized void readUnLock() {        this.readingReaders--;        this.notifyAll();    }    public synchronized void writeLock() throws InterruptedException {        this.waitingWriters++;        try {            while (readingReaders > 0 || writingWriters > 0) {                this.wait();            }            this.writingWriters++;        } finally {            this.waitingWriters--;        }    }    public synchronized void writeUnlock() {        this.writingWriters--;        this.notifyAll();    }}public class SharedData {    private final char[] buffer;    private final ReadWriteLock lock = new ReadWriteLock();    public SharedData(int size) {        this.buffer = new char[size];        for (int i = 0; i < size; i++) {            this.buffer[i] = '*';        }    }    public char[] read() throws InterruptedException {        try {            lock.readLock();            return this.doRead();        } finally {            lock.readUnLock();        }    }    public void write(char c) throws InterruptedException {        try {            lock.writeLock();            this.doWrite(c);        } finally {            lock.writeUnlock();        }    }    private void doWrite(char c) {        for (int i = 0; i < buffer.length; i++) {            buffer[i] = c;            slowly(10);        }    }    private char[] doRead() {        char[] newBuf = new char[buffer.length];        for (int i = 0; i < buffer.length; i++) {            newBuf[i] = buffer[i];        }        slowly(50);        return newBuf;    }    private void slowly(int millisecond) {        try {            Thread.sleep(millisecond);        } catch (InterruptedException e) {            e.printStackTrace();        }    }}
public class WriterWorker extends Thread {    private static final Random random = new Random(System.currentTimeMillis());    private final SharedData data;    private final String filter;    private int index = 0;    public WriterWorker(SharedData data, String filter) {        this.data = data;        this.filter = filter;    }    @Override    public void run() {        try {            while (true) {                char c = nextChar();                data.write(c);                Thread.sleep(random.nextInt(1000));            }        } catch (InterruptedException e) {            e.printStackTrace();        }    }    private char nextChar() {        char c = filter.charAt(index);        index++;        if (index >= filter.length())            index = 0;        return c;    }}
public class ReadWriteLockClient {    public static void main(String[] args) {        final  SharedData sharedData = new SharedData(10);        new ReaderWorker(sharedData).start();        new ReaderWorker(sharedData).start();        new ReaderWorker(sharedData).start();        new ReaderWorker(sharedData).start();        new ReaderWorker(sharedData).start();        new WriterWorker(sharedData,"123456").start();        new WriterWorker(sharedData,"abcdef").start();    }}

结果:

Thread-0 reads **********
Thread-1 reads **********
Thread-2 reads **********
Thread-3 reads **********
Thread-1 reads aaaaaaaaaa
Thread-3 reads aaaaaaaaaa
Thread-0 reads aaaaaaaaaa
Thread-2 reads aaaaaaaaaa
Thread-1 reads aaaaaaaaaa
Thread-2 reads aaaaaaaaaa
Thread-0 reads aaaaaaaaaa
Thread-3 reads aaaaaaaaaa
Thread-1 reads aaaaaaaaaa
Thread-3 reads aaaaaaaaaa
Thread-0 reads aaaaaaaaaa
Thread-2 reads aaaaaaaaaa
Thread-2 reads aaaaaaaaaa
Thread-0 reads aaaaaaaaaa
Thread-1 reads aaaaaaaaaa
Thread-3 reads aaaaaaaaaa
Thread-2 reads aaaaaaaaaa
Thread-0 reads aaaaaaaaaa
Thread-1 reads aaaaaaaaaa
Thread-3 reads aaaaaaaaaa
Thread-0 reads bbbbbbbbbb
Thread-1 reads bbbbbbbbbb
Thread-2 reads bbbbbbbbbb
Thread-3 reads bbbbbbbbbb
Thread-0 reads bbbbbbbbbb
Thread-1 reads bbbbbbbbbb
Thread-3 reads bbbbbbbbbb
Thread-2 reads bbbbbbbbbb
Thread-0 reads bbbbbbbbbb
Thread-1 reads bbbbbbbbbb
Thread-2 reads bbbbbbbbbb
Thread-3 reads bbbbbbbbbb
Thread-0 reads bbbbbbbbbb
Thread-1 reads bbbbbbbbbb
Thread-3 reads bbbbbbbbbb
Thread-2 reads bbbbbbbbbb
Thread-1 reads 3333333333
Thread-2 reads 3333333333
Thread-3 reads 3333333333
...... 省略

以上是“Java多线程中读写锁分离设计模式怎么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: Java多线程中读写锁分离设计模式怎么用

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

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

猜你喜欢
  • Java多线程中读写锁分离设计模式怎么用
    小编给大家分享一下Java多线程中读写锁分离设计模式怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!主要完成任务:read read 并行化read writ...
    99+
    2023-06-25
  • Java多线程之读写锁分离设计模式
    主要完成任务: 1.read read 并行化 2.read write 不允许 3.write write 不允许 public class Rea...
    99+
    2024-04-02
  • Java多线程中Future设计模式怎么用
    这篇文章将为大家详细讲解有关Java多线程中Future设计模式怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Future -> 代表的是未来的一个凭据public interfac...
    99+
    2023-06-25
  • Java多线程之Future设计模式
    目录Future -> 代表的是未来的一个凭据AsynFuture -> Future具体实现类FutureService -> 桥接Future和FutureTa...
    99+
    2024-04-02
  • Java多线程 Guarded Suspension设计模式
    目录1.Guarded Suspension模式的结构2. Guarded Suspension模式的简单实现前言: Guarded Suspension意为保护暂停,其核心思想是仅...
    99+
    2024-04-02
  • Java多线程之readwritelock读写分离的实现代码
    在多线程开发中,经常会出现一种情况,我们希望读写分离。就是对于读取这个动作来说,可以同时有多个线程同时去读取这个资源,但是对于写这个动作来说,只能同时有一个线程来操作,而且同时,当有一个写线程在操作这个资源的时候,其他的读线程是不能来操作这...
    99+
    2023-05-31
    java 多线程 adw
  • Java多线程 Producer and Consumer设计模式
    目录 producer是生产者的意思:指生产数据的线程, consumer是消费者的意思:指的是使用数据的线程 public class ProducerThr...
    99+
    2024-04-02
  • Java多线程如何使用Guarded Suspension设计模式
    这篇文章主要介绍“Java多线程如何使用Guarded Suspension设计模式”,在日常操作中,相信很多人在Java多线程如何使用Guarded Suspension设计模式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法...
    99+
    2023-06-25
  • 怎么在java中利用spring实现读写分离
    怎么在java中利用spring实现读写分离?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1.  背景我们一般应用对数据库而言都是“读多写少”,也就说对数据库读取数据...
    99+
    2023-05-30
    spring java
  • Java中多线程Reactor模式怎么实现
    这篇文章主要讲解了“Java中多线程Reactor模式怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中多线程Reactor模式怎么实现”吧!多线程Reactor模式旨在分配多...
    99+
    2023-06-21
  • Java的Future多线程模式怎么使用
    本篇内容介绍了“Java的Future多线程模式怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在Java5后,提供了大量处理多线程的...
    99+
    2023-06-17
  • C语言多线程开发中死锁与读写锁问题怎么解决
    今天小编给大家分享一下C语言多线程开发中死锁与读写锁问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。死锁有时,一个...
    99+
    2023-06-30
  • Java多线程之锁怎么使用
    本篇内容介绍了“Java多线程之锁怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先强调一点:Java多线程的锁都是基于对象的,Ja...
    99+
    2023-07-05
  • java中mvc设计模式怎么使用
    在Java中使用MVC(Model-View-Controller)设计模式需要按照以下步骤进行:1. 创建模型(Model):模型...
    99+
    2023-10-10
    java
  • 怎么解析Java多线程程序设计
    小编今天带大家了解怎么解析Java多线程程序设计,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习“怎么解析Java多线程程序设计”的知识...
    99+
    2023-06-03
  • Java中怎么利用多线性同步读写数据
    Java中怎么利用多线性同步读写数据,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。public class SynTest ...{  ...
    99+
    2023-06-17
  • Java工厂设计模式的代码怎么写
    这篇“Java工厂设计模式的代码怎么写”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Jav...
    99+
    2024-04-02
  • SpringBoot中怎么利用MyCat实现读写分离
    SpringBoot中怎么利用MyCat实现读写分离,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。MySQL配置主从关系说明 192.168.0.10...
    99+
    2023-06-16
  • Java的设计模式怎么使用
    本篇内容主要讲解“Java的设计模式怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java的设计模式怎么使用”吧!设计模式是一种通过分割那些保持不变的部分和经常变化的部分,让你的代码更容...
    99+
    2023-06-16
  • Java多线程编程中的锁有什么用
    这篇文章主要讲解了“Java多线程编程中的锁有什么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java多线程编程中的锁有什么用”吧!阅读目录一、尽量不要锁住方法二、缩小同步代码块,只锁数...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作