ReentrantReadWriteLock

81 阅读1分钟

ReetrantReadWriteLock读读共享

ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();
ReentrantReadWriteLock.ReadLock readLock = reentrantReadWriteLock.readLock();
ReentrantReadWriteLock.WriteLock writeLock = reentrantReadWriteLock.writeLock();

//读读共享
new Thread(() -> {
    readLock.lock();
    System.out.println(Thread.currentThread().getName() + "开始加锁");
    try {
        System.out.println("处理业务");
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        readLock.unlock();
        System.out.println(Thread.currentThread().getName() + "释放锁");
    }
}).start();
new Thread(() -> {
    readLock.lock();
    System.out.println(Thread.currentThread().getName() + "开始加锁");
    try {
        System.out.println("处理业务");
    } finally {
        readLock.unlock();
        System.out.println(Thread.currentThread().getName() + "释放锁");
    }
}).start();

执行结果

Thread-0开始加锁
处理业务
Thread-1开始加锁
处理业务
Thread-1释放锁
Thread-0释放锁

可以看出Thread-1无须待Thread-0释放锁之后才加锁。

ReetrantReadWriteLock读写互斥

ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();
ReentrantReadWriteLock.ReadLock readLock = reentrantReadWriteLock.readLock();
ReentrantReadWriteLock.WriteLock writeLock = reentrantReadWriteLock.writeLock();

//读写互斥
new Thread(() -> {
    writeLock.lock();
    System.out.println(Thread.currentThread().getName() + "开始加锁");
    try {
        System.out.println("处理业务");
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        writeLock.unlock();
        System.out.println(Thread.currentThread().getName() + "释放锁");
    }
}).start();
new Thread(() -> {
    readLock.lock();
    System.out.println(Thread.currentThread().getName() + "开始加锁");
    try {
        System.out.println("处理业务");
    } finally {
        readLock.unlock();
        System.out.println(Thread.currentThread().getName() + "释放锁");
    }
}).start();
Thread-0开始加锁
处理业务
Thread-0释放锁
Thread-1开始加锁
处理业务
Thread-1释放锁

可以看出Thread-1必须在Thread-0释放锁之后才能进行加锁操作。

ReetrantReadWriteLock写写互斥

ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();
ReentrantReadWriteLock.ReadLock readLock = reentrantReadWriteLock.readLock();
ReentrantReadWriteLock.WriteLock writeLock = reentrantReadWriteLock.writeLock();

//写写互斥
new Thread(() -> {
    writeLock.lock();
    System.out.println(Thread.currentThread().getName() + "开始加锁");
    try {
        System.out.println("处理业务");
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        writeLock.unlock();
        System.out.println(Thread.currentThread().getName() + "释放锁");
    }
}).start();
new Thread(() -> {
    writeLock.lock();
    System.out.println(Thread.currentThread().getName() + "开始加锁");
    try {
        System.out.println("处理业务");
    } finally {
        writeLock.unlock();
        System.out.println(Thread.currentThread().getName() + "释放锁");
    }
}).start();
Thread-0开始加锁
处理业务
Thread-0释放锁
Thread-1开始加锁
处理业务
Thread-1释放锁

可以看出Thread-1必须在Thread-0释放锁之后才能进行加锁操作。