原创

第十篇 : ReadWriteLock 读写锁


简介

  • ReadWriteLock 维护了一对相关的锁,一个用于只读操作, 另一个用于写入操作。只要没有 writer,读取锁可以由 多个 reader 线程同时保持。写入锁是独占的。。
  • ReadWriteLock 读取操作通常不会改变共享资源,但执行 写入操作时,必须独占方式来获取锁。对于读取操作占 多数的数据结构。 ReadWriteLock 能提供比独占锁更高 的并发性。而对于只读的数据结构,其中包含的不变性 可以完全不需要考虑加锁操作。

一、使用

package com.gf.demo;


import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class TestReadWriteLock {

    public static void main(String args[]) {

        ReadWriteLockDemo rw = new ReadWriteLockDemo();

        new Thread( new Runnable() {
            @Override
            public void run() {
                rw.set((int)(Math.random() * 101));
            }
        } , "Write" ).start();

        for (int i = 0 ; i < 100 ; i++) {
            new Thread( new Runnable() {
                @Override
                public void run() {
                    rw.get();
                }
            } , "Read" ).start();
        }

    }

}

class ReadWriteLockDemo {
    private int number;
    private ReadWriteLock lock = new ReentrantReadWriteLock();

    /**
     * 读
     */
    public void get() {
        //上锁
        lock.readLock().lock();

        try {
            System.out.println(Thread.currentThread().getName() + " : " + number);
            Thread.sleep( 5000 );
            System.out.println("结束!");
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.readLock().unlock();
        }

    }

    /**
     * 写
     */
    public void set(int number) {
        lock.writeLock().lock();
        try {

            System.out.println(Thread.currentThread().getName() + " : " + number);
            this.number = number;
            Thread.sleep( 3000 );
        } catch (InterruptedException e){
            e.printStackTrace();
        }finally {
            lock.writeLock().unlock();
        }
    }
}
juc
  • 作者:程序员果果
  • 发表时间:2018-11-07 09:32
  • 版权声明:自由转载-非商用-非衍生-保持署名 (创意共享4.0许可证)
  • 公众号转载:请在文末添加作者公众号二维码
  • 评论