Java高并发--读写锁(ReadWriteLock)

151 阅读1分钟

ReadWriteLock读写锁

ReadWriteLock是JDK5中提供的读写分离锁。该锁可以有效地帮助减少锁竞争,提升系统性能。特点是:

  • 读-读不互斥:读读之间不会阻塞
  • 读-写互斥:读阻塞写,写也会阻塞读
  • 写-写互斥:写写会阻塞

使用案例: `

import java.util.Random;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class ReadWriteLockDemo {
    private static Lock lock=new ReentrantLock();
    private static ReentrantReadWriteLock readWriteLock=new ReentrantReadWriteLock();
    private static Lock readLock=readWriteLock.readLock();
    private static Lock writeLock=readWriteLock.writeLock();
    private int value;
    public Object handleRead(Lock lock)throws InterruptedException{
        try {
            //模拟读操作
            lock.lock();
            Thread.sleep(1000);
            return value;
        }finally {
            lock.unlock();
        }
    }
    public void handleWrite(Lock lock,int index)throws InterruptedException{
        try{
            //模拟写操作
            lock.lock();
            Thread.sleep(1000);
            value=index;
        }finally {
            lock.unlock();
        }
    }

    public static void main(String[] args) {
        final ReadWriteLockDemo demo=new ReadWriteLockDemo();
        Runnable readRunnable=new Runnable() {
            @Override
            public void run() {
                try{
                    demo.handleRead(readLock);
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
            }
        };
        Runnable writeRunnable =new Runnable() {
            @Override
            public void run() {
                try{
                    demo.handleWrite(writeLock,new Random().nextInt());
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
            }
        };
        for (int i=0;i<18;i++){
            new Thread(readRunnable).start();
        }
        for (int i=18;i<20;i++){
            new Thread(writeRunnable).start();
        }
    }
}

`