千家信息网

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

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,小编给大家分享一下Java多线程中读写锁分离设计模式怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!主要完成任务:1.
千家信息网最后更新 2025年02月01日Java多线程中读写锁分离设计模式怎么用

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

主要完成任务:

  • 1.read read 并行化

  • 2.read write 不允许

  • 3.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;    }}
/** * * ReadWriteLock */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多线程中读写锁分离设计模式怎么用"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

线程 篇文章 模式 设计模式 设计 内容 正在 不怎么 任务 大部分 更多 知识 结果 行业 资讯 资讯频道 频道 参考 学习 帮助 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 数据库中如何设计一个储存过程 什么是网络技术咨询质量保障 sql数据库设置单个人用户 7g网络技术领先 sql数据库加另一个硬盘 网络安全销售工作怎么样 一间民宿软件开发 青海家庭教育与网络安全直播 亚光科技低轨卫星互联网 用友升级数据库如何暂停 网络安全联动方案 网络安全和管理功能 小型计算机数据库管理系统 git服务器回滚 网络安全编程期末题道客巴巴 如何自觉遵守网络安全 河北文档软件开发技术 沈阳网络安全与执法专业大学 宝安区品质网络技术开发工艺 浪潮服务器管理口配地址 广东彦成互联网科技有限公司 高速通服务器异常什么原因 盘锦app软件开发公司 数据库怎么看有没有打开 如何抓取单元格的数据库 网络安全等保三级要求 关于网络安全法手抄报 计算机等级三级网络技术 网络技术人员所需性格 安捷伦质谱仪的数据库
0