3.10 ReentrantReadWriteLock使用

3.10 ReentrantReadWriteLock

       ReadWriteLock即读写锁,ReadWriteLock的规则如下。

       a.当有线程获取了Write锁时,其他线程不能获取到任何锁(写锁和读锁都不能。
       b.当没有线程获取Wrete锁时,所有线程都可以获取Read锁。
       c.当有Read锁存在时,获取不到Write锁。



3.10.1 ReentrantReadWriteLock实现类继承关系

3.10 ReentrantReadWriteLock使用_第1张图片
       可见该类实现了ReadWriteLock接口。



3.10.2 ReentrantReadWriteLock使用

       创建一个读写锁。

static ReadWriteLock lock = new ReentrantReadWriteLock();

       获取写锁。

lock.writeLock().lock();

       释放写锁。

lock.writeLock().unlock();

       获取读锁。

lock.readLock().lock();

       释放读锁。

lock.readLock().unlock();

3.10.3 ReentrantReadWriteLock使用实例

       该实例测试的是上边的规则c——当有Read锁存在时,获取不到Write锁。让一个线程先获取到读锁并持有5秒钟。这是其他线程尝试去获取写锁,发现5秒之后其他线程再开始写入然后在控制台打印出结果。

class ReadWriteLockDemo{
     
    static ReadWriteLock lock = new ReentrantReadWriteLock();
    static String text = "hello";


    public static void modify(){
     
        lock.writeLock().lock();
        try {
     
            System.err.println(Thread.currentThread().getName()+"开始修改");
            text += " "+Thread.currentThread().getName();
        }catch (Exception e){
     
            e.printStackTrace();
        }
        finally {
     
            lock.writeLock().unlock();
        }
    }

    public static void readWithReadLock(){
     
        lock.readLock().lock();
        try {
     
            System.err.println(text);
            Thread.sleep(5000);
            System.err.println("5秒过去了");
        }catch (Exception e){
     

        }finally {
     
            lock.readLock().unlock();
        }

    }

    public static void main(String[] args) throws InterruptedException {
     
        new Thread(()->{
     
            readWithReadLock();
        }).start();
        Thread.sleep(1000);
        for (int i=0;i<10;i++) {
     
            new Thread(() -> {
     
                modify();
            }).start();
        }

    }

}

3.10 ReentrantReadWriteLock使用_第2张图片
       使用读写锁时需要需要明确上述三条规则。并且可知,当读很多时,很难写入,所以读写锁不适用于读和写都很多的情况

你可能感兴趣的:(#,3,多线程和并发,java,并发编程,ReadWriteLock使用,java读写锁使用解析,读写锁使用)