可重入的读写锁ReentrantReadWriteLock

Posted on 2017-08-26 09:24  tychina123  阅读(115)  评论(0)    收藏  举报
ReentrantReadWriteLock实现了读锁和写锁的功能,对于读锁和读锁之间,可以并行,读锁和写锁则是互斥的,写锁和写锁之间是互斥的。测试代码如下:
package com.example.test.courrent;

import com.example.test.util.AppUtils;

import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * Created by lixiaoming on 2017/8/25.
 * 可重入读写锁
 * 读锁写锁之间互斥,读锁之间可以并行
 *
 */
public class ReetrantReadWriteLockDemo {

    private ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();

    Runnable read = new Runnable() {
        @Override
        public void run() {
            readWriteLock.readLock().lock();
            System.out.println(AppUtils.getTimeLable()+ " in read lock, id is  "+Thread.currentThread().getId());
            AppUtils.sleep(5);
            readWriteLock.readLock().unlock();
        }
    };

    Runnable write = new Runnable() {
        @Override
        public void run() {
            System.out.println(AppUtils.getTimeLable()+ " try get write lock, id is  "+Thread.currentThread().getId());
            readWriteLock.writeLock().lock();
            System.out.println(AppUtils.getTimeLable()+ " in write lock, id is  "+Thread.currentThread().getId());
            AppUtils.sleep(5);
            readWriteLock.writeLock().unlock();
        }
    };

    private void testRead2Read(){
        Thread t1 = new Thread(read);
        Thread t2 = new Thread(read);
        t1.start();
        t2.start();
    }

    private void testRead2Write(){
        Thread t1 = new Thread(read);
        Thread t2 = new Thread(write);
        t1.start();
        t2.start();
    }

    private void testWrite2Write(){
        Thread t1 = new Thread(write);
        Thread t2 = new Thread(write);
        t1.start();
        t2.start();
    }

    public static void main(String[] args) {
        ReetrantReadWriteLockDemo reetrantReadWriteLockDemo = new ReetrantReadWriteLockDemo();
        int caseId = 3;
        switch (caseId){
            case 1:
                reetrantReadWriteLockDemo.testRead2Read();
                break;
            case 2:
                reetrantReadWriteLockDemo.testRead2Write();
                break;
            case 3:
                reetrantReadWriteLockDemo.testWrite2Write();
                break;
        }
    }
}

 

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3