package com.ydlclass.lock;

import java.util.Random;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import static  java.util.concurrent.locks.ReentrantReadWriteLock.*;
public class ReentrantReadWriteLockOwnTest {
    //背景:对于电商以及其他的业务常见的就是可能对于一些商家的操作是很少的但是对于读操作很多,如果在读写的时候都限制同一时间只能一个线程读,
    //显然系统的效率实在是很低下的,这时就需要我们对于改进,可以使用locks包中的ReenteantReadWriteLock类来实现业务。这个类有两个成员方法
    //一个是writeLock(),一个是readLock()方法,这两个方***返回一个ReadLock类的对象,一个会返回WriteLock类的对象。
    public static ReentrantReadWriteLock LockOfReadWrite = new ReentrantReadWriteLock();
    public static int COUNT = 1;//用于被修改的字段
    public static void main(String[] args) {
        //生成大量的线程
        for (int i = 0; i < 100; i++) {
            Random random = new Random();
            int i1 = random.nextInt(100);
            if (i1 > 20){
                new Thread(() -> {
                    ReadLock readLock = LockOfReadWrite.readLock();//返回一个读锁。这个对象的类型是ReadLock类,并且这个类是Lock接口的实现类,于是就可以上锁了
                    readLock.lock();
                    try {
                        ThreadUtil.sleep(1000);
                        System.out.println("我正在读" + COUNT);
                    } finally {
                        readLock.unlock();//读完之后释放锁资源
                    }
                },"read").start();
            } else {
                new Thread(()-> {

                    WriteLock writeLock = LockOfReadWrite.writeLock();//返回的对象和上面的相似
                    writeLock.lock();
                    try {
                        ThreadUtil.sleep(1000);
                        System.out.println("我正在写" + COUNT++);
                    } finally {
                        writeLock.unlock();
                    }
                },"write").start();
            }
        }
    }
}