zoukankan      html  css  js  c++  java
  • java读写锁

    实现高并发情况下,多线程读和读不互斥,读和写互斥,写和写互斥,代码如下:

    package threadLock;
    
    import java.util.Random;
    import java.util.concurrent.locks.ReadWriteLock;
    import java.util.concurrent.locks.ReentrantReadWriteLock;
    
    public class ReadWriterLockTest {
    
        public void init() {
            final Queue queue = new Queue();
    
            //开启三个读的线程
            for (int i = 0; i < 3; ++i) {
                new Thread(new Runnable() {
    
                    @Override
                    public void run() {
                        while(true){
                            queue.readData();
                        }
                    }
                }).start();
            }
            //开启三个写的线程
            for (int i = 0; i < 3; ++i) {
                new Thread(new Runnable() {
    
                    @Override
                    public void run() {
                        while(true)
                            queue.writerData();
                    }
                }).start();
            }
        }
    
        class Queue {
            private Integer data; // 多线程操作的资源
    
            ReadWriteLock rwl = new ReentrantReadWriteLock();  //读写锁,读和读不互斥,读和写互斥,读和读互斥
            
            public void readData() {
                try {
                    rwl.readLock().lock();  //上读锁,线程只能做读操作
                    System.out.println(Thread.currentThread().getName()
                            + " ready to read");
                    Thread.sleep(300);
                    System.out.println(Thread.currentThread().getName()
                            + "has read data is " + data);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally{
                    rwl.readLock().unlock(); //释放读锁
                }
            }
    
            public void writerData() {
                try {
                    rwl.writeLock().lock();  //上写锁,只能当前线程执行
                    System.out.println(Thread.currentThread().getName()
                            + " ready to write");
                    Thread.sleep(300);
                    this.data = new Random().nextInt(10000);
                    System.out.println(Thread.currentThread().getName()
                            + "has write data is " + data);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally{
                    rwl.writeLock().unlock(); //释放写锁
                }
            }
        }
    
        public static void main(String[] args) {
            new ReadWriterLockTest().init();
        }
    }
  • 相关阅读:
    前后端交互实现(nginx,json,以及datatable的问题相关)
    前端工作笔记
    系统前端基本文件+ajax部分理解
    python(day17)二分查找
    python(day16)内置函数,匿名函数
    day15(PYTHON)推导式{生成器,字典,列表,集合}
    Javascript 模拟 new
    Javascript call和apply的模拟实现
    Javascript——bind的模拟实现
    模拟Vue 中数据双向绑定
  • 原文地址:https://www.cnblogs.com/zhouquan-1992-04-06/p/6283549.html
Copyright © 2011-2022 走看看