我是靠谱客的博主 冷酷万宝路,最近开发中收集的这篇文章主要介绍2021版Java多线程教程29:读写锁实战高并发容器全集代码,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

2021版Java多线程教程

全集

2021版Java多线程教程

代码

RWDictionary.class

package main;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * 高并发容器
 */
public class RWDictionary {
    /**
     * key-value容器
     */
    private final Map<String, Object> m = new HashMap<>();
    /**
     * 读写锁
     */
    private final ReadWriteLock rwl = new ReentrantReadWriteLock(true);
    /**
     * 读锁
     */
    private final Lock r = rwl.readLock();
    /**
     * 写锁
     */
    private final Lock w = rwl.writeLock();

    /**
     * 返回键对应的值。
     *
     * @param key 键。
     * @return 键对应的值。
     */
    public Object get(String key) {
        // 获取读锁
        r.lock();
        try {
            // 返回键对应的值
            return m.get(key);
        } finally {
            // 释放读锁
            r.unlock();
        }
    }

    /**
     * 返回所有的键。
     *
     * @return 所有的键。
     */
    public String[] allKeys() {
        // 获取读锁
        r.lock();
        try {
            // 返回所有的键
            return m.keySet().toArray(new String[0]);
        } finally {
            // 释放读锁
            r.unlock();
        }
    }

    /**
     * 添加键和值,并返回数据。
     *
     * @param key 键。
     * @param value 值。
     * @return 返回添加的数据。
     */
    public Object put(String key, Object value) {
        // 获取写锁
        w.lock();
        try {
            // 添加数据
            return m.put(key, value);
        } finally {
            // 释放写锁
            w.unlock();
        }
    }

    /**
     * 清空容器。
     */
    public void clear() {
        // 获取写锁
        w.lock();
        try {
            // 清空容器
            m.clear();
        } finally {
            // 释放写锁
            w.unlock();
        }
    }
}

WriteTask.class

package main;

public class WriteTask implements Runnable {
    /**
     * 高并发容器
     */
    private RWDictionary dictionary;

    public WriteTask(RWDictionary dictionary) {
        this.dictionary = dictionary;
    }

    @Override
    public void run() {
        // 计数器
        int i = 0;
        // 无限写入
        while (true) {
            try {
                // 使当前线程休眠1秒钟
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            // 获取当前线程名称
            String name = Thread.currentThread().getName();
            // 存储数据
            dictionary.put("人人都是程序员", name + "---" + i++);
        }
    }
}

ReadTask.class

package main;

public class ReadTask implements Runnable {
    /**
     * 高并发容器
     */
    private RWDictionary dictionary;

    public ReadTask(RWDictionary dictionary) {
        this.dictionary = dictionary;
    }

    @Override
    public void run() {
        // 无限读取
        while (true) {
            try {
                // 使当前线程休眠1秒钟
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            // 获取所有的key
            String[] keys = dictionary.allKeys();
            // 遍历所有的key
            for (String key : keys) {
                Object value = dictionary.get(key);
                System.out.println(key + ":" + value);
            }
        }
    }
}

Main.class

package main;

public class Main {

    public static void main(String[] args) {
        // 创建高并发容器
        RWDictionary dictionary = new RWDictionary();
        // 创建读、写任务
        WriteTask writeTask = new WriteTask(dictionary);
        ReadTask readTask = new ReadTask(dictionary);
        // 创建读、写线程
        Thread writeThread0 = new Thread(writeTask);
        Thread writeThread1 = new Thread(writeTask);
        Thread writeThread2 = new Thread(writeTask);
        Thread readThread0 = new Thread(readTask);
        Thread readThread1 = new Thread(readTask);
        Thread readThread2 = new Thread(readTask);
        // 启动线程
        writeThread0.start();
        writeThread1.start();
        writeThread2.start();
        readThread0.start();
        readThread1.start();
        readThread2.start();
    }
}

最后

以上就是冷酷万宝路为你收集整理的2021版Java多线程教程29:读写锁实战高并发容器全集代码的全部内容,希望文章能够帮你解决2021版Java多线程教程29:读写锁实战高并发容器全集代码所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部