java併發編程學習之ReentrantReadWriteLock

ReentrantReadWriteLock,讀寫鎖,適用於讀多寫少的狀況,容許多個線程進行讀,可是有寫的進程的時候,就阻塞。ide

示例

public class ReadWriteLockDemo {
    ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
    Lock readLock = readWriteLock.readLock();
    Lock writeLock = readWriteLock.writeLock();
    int num = 0;
    int num2 = 0;

    public void readNum() {
        readLock.lock();
        try {
            Thread.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            readLock.unlock();
        }
    }

    public void writeNum() {
        writeLock.lock();
        try {
            num++;
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            writeLock.unlock();
        }
    }

    public synchronized void readNum2() {
        try {
            Thread.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public void writeNum2() {
        try {
            num2++;
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    static class ReadThread extends Thread {
        ReadWriteLockDemo readWriteLockDemo;

        public ReadThread(ReadWriteLockDemo readWriteLockDemo) {
            this.readWriteLockDemo = readWriteLockDemo;
        }

        @Override
        public void run() {
            long start = System.currentTimeMillis();
            for (int i = 0; i < 100; i++) {
                readWriteLockDemo.readNum();
            }
            System.out.println("ReadThread耗時:" + (System.currentTimeMillis() - start));
        }
    }

    static class WriteThread extends Thread {
        ReadWriteLockDemo readWriteLockDemo;

        public WriteThread(ReadWriteLockDemo readWriteLockDemo) {
            this.readWriteLockDemo = readWriteLockDemo;
        }

        @Override
        public void run() {
            long start = System.currentTimeMillis();
            for (int i = 0; i < 10; i++) {
                readWriteLockDemo.writeNum();
            }
            System.out.println("WriteThread耗時:" + (System.currentTimeMillis() - start));
        }
    }

    static class ReadThread2 extends Thread {
        ReadWriteLockDemo readWriteLockDemo;

        public ReadThread2(ReadWriteLockDemo readWriteLockDemo) {
            this.readWriteLockDemo = readWriteLockDemo;
        }

        @Override
        public void run() {
            long start = System.currentTimeMillis();
            for (int i = 0; i < 100; i++) {
                readWriteLockDemo.readNum2();
            }
            System.out.println("ReadThread2耗時:" + (System.currentTimeMillis() - start));
        }
    }

    static class WriteThread2 extends Thread {
        ReadWriteLockDemo readWriteLockDemo;

        public WriteThread2(ReadWriteLockDemo readWriteLockDemo) {
            this.readWriteLockDemo = readWriteLockDemo;
        }

        @Override
        public void run() {
            long start = System.currentTimeMillis();
            for (int i = 0; i < 10; i++) {
                readWriteLockDemo.writeNum2();
            }
            System.out.println("WriteThread2耗時:" + (System.currentTimeMillis() - start));
        }
    }

    public static void main(String[] args) {
        ReadWriteLockDemo demo = new ReadWriteLockDemo();
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 5; j++) {
                 new ReadThread(demo).start();
                //   new ReadThread2(demo).start();
            }
              new WriteThread(demo).start();
            //   new WriteThread2(demo).start();
        }
    }
}

運行兩個不一樣的結果,能夠看出,讀寫鎖運行的效率更高this

相關文章
相關標籤/搜索