java ReentrantReadWriteLock读写锁

1.ReentrantReadWriteLock会锁写锁,但是不会锁读锁

2.

如何获取写锁

ReentrantReadWriteLock reentrantReadWriteLock=new ReentrantReadWriteLock();
reentrantReadWriteLock.writeLock().lock();
reentrantReadWriteLock.writeLock().unlock();

如何获取读锁

reentrantReadWriteLock.readLock().lock();
reentrantReadWriteLock.readLock().unlock();

测试用例

package com.example.demo;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class Test {
    private ReentrantReadWriteLock reentrantReadWriteLock=new ReentrantReadWriteLock();

    private double integer=0;

    public void put(){
        reentrantReadWriteLock.writeLock().lock();
        System.out.println(Thread.currentThread().getName()+"ready to put data");
        try {
            Thread.sleep((long) (Math.random()*1000));
        }catch (Exception e){
            e.printStackTrace();
        }
        integer=Math.random()*10;
        System.out.println(Thread.currentThread().getName()+"had put the data:"+integer);
        reentrantReadWriteLock.writeLock().unlock();
    }

    public void get(){
        reentrantReadWriteLock.readLock().lock();
        System.out.println(Thread.currentThread().getName()+"ready to get data");
        try {
            Thread.sleep((long) (Math.random()*1000));
        }catch (Exception e){
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+"had get the data:"+integer);
        reentrantReadWriteLock.readLock().unlock();
    }

    public static void main(String[] args) {
        Test test=new Test();
        for(int i=0;i<4;i++){
            new Thread() {
                public void run() {
                    test.put();
                }
            }.start();
        }

        for(int i=0;i<4;i++){
            new Thread() {
                public void run() {
                    test.get();
                }
            }.start();
        }
    }
}

执行结果:

Thread-0ready to put data
Thread-0had put the data:9.312718551432198
Thread-1ready to put data
Thread-1had put the data:2.3961302731992196
Thread-2ready to put data
Thread-2had put the data:7.6995931493714656
Thread-3ready to put data
Thread-3had put the data:5.831579769287028
Thread-4ready to get data
Thread-5ready to get data
Thread-6ready to get data
Thread-7ready to get data
Thread-6had get the data:5.831579769287028
Thread-4had get the data:5.831579769287028
Thread-7had get the data:5.831579769287028
Thread-5had get the data:5.831579769287028

可以看到写的时候锁住了,读的时候是不可重入的。注意使用同一把锁

猜你喜欢

转载自blog.csdn.net/weixin_38336658/article/details/81484770