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();
        }
    }
  • 相关阅读:
    C/C++程序员应聘常见面试题剖析(经典)
    连续几个数组在内存中的存储地址
    虚析构函数
    c++中的函数模版和类模版
    C++多态性(续)
    malloc和new的区别和联系
    深入浅出多线程系列之四:简单的同步 lock
    Silverlight_Rest_WCF系列之六:跨线程
    深入浅出多线程系列之五:一些同步构造(下篇)
    深入浅出多线程系列之五:一些同步构造(上篇)
  • 原文地址:https://www.cnblogs.com/zhouquan-1992-04-06/p/6283549.html
Copyright © 2011-2022 走看看