ReadWriteLock中read有加锁和没加锁执行过程的区别

关于读写锁

写的时候其他线程不能进来,只能等待线程写完。读的时候其他线程可以读取,但是加了个读锁保证连续读逻辑上的一致性。

资料来源:

https://www.liaoxuefeng.com/wiki/1252599548343744/1306581002092578#0

 


import java.util.concurrent.locks.*;

public class DemoReadWriteLock {

    public static void main(String[] args) {
        var counter=new Counter();

        for (int i = 0; i <10 ; i++) {
            var writeThread=new Thread("write"+i){
                @Override
                public void run() {
                   // System.out.println("当前的线程是:"+Thread.currentThread().getName());
                   int xcount=(int)(Math.random()*10);
                   int ycount=(int)(Math.random()*10);
                   int []aa=new int []{xcount,ycount};
                    try {
                        counter.writeCount(aa);
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    // System.out.println("当前的线程是:"+Thread.currentThread().getName()+"  读取的count是:"+count);
                }
            };
            writeThread.start();
        }

        for (int i = 0; i <10 ; i++) {
            var readThread=new Thread("read"+i){
                @Override
                public void run() {
                    //System.out.println("当前的线程是:"+Thread.currentThread().getName());
                    int[] count= new int[0];
                    try {
                        count = counter.readCount();
                        System.out.println("1最终读到的线程"+Thread.currentThread().getName()+"xcount:"+count[0]+",ycount:"+count[1]);
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("2最终读到的线程:"+Thread.currentThread().getName()+"  读取的xcount:"+count[0]+",ycount:"+count[1]);
                }
            };
            readThread.start();
        }


    }


}

class Counter {
    private ReadWriteLock lockObj= new ReentrantReadWriteLock();

    private Lock writeLock=lockObj.writeLock();
    private Lock readLock=lockObj.readLock();
    private int[] obj;


//    public int[] readCount() throws InterruptedException {
//        readLock.lock();
//        System.out.println("获得读锁,读线程-name:"+Thread.currentThread().getName()+"-刚开始进来前的数值是(obj[0]:"+obj[0]+",obj[1]:"+obj[1]+")");
//        String name="我多加了一次赋值看看"+Thread.currentThread().getName();
//        name+="~二次赋值看看"+Thread.currentThread().getName();
//        name+="~三次赋值看看"+Thread.currentThread().getName();
//        int x=obj[0];
//        int y=obj[1];
//        System.out.println("获得读锁,读线程-name:"+Thread.currentThread().getName()+"(obj[0]:"+obj[0]+",obj[1]:"+obj[1]+")"+"-"+name);
//        try{
//            return obj;
//        }
//        finally {
//            readLock.unlock();
//        }
//
//    }
    public int[] readCount() throws InterruptedException {
        System.out.println("无锁,读线程-name:"+Thread.currentThread().getName()+"-刚开始进来前的数值是(obj[0]:"+obj[0]+",obj[1]:"+obj[1]+")");
        String name="我多加了一次赋值看看"+Thread.currentThread().getName();
        name+="~二次赋值看看"+Thread.currentThread().getName();
        name+="~三次赋值看看"+Thread.currentThread().getName();
        int x=obj[0];
        int y=obj[1];
        System.out.println("无锁,读线程-name:"+Thread.currentThread().getName()+"(obj[0]:"+obj[0]+",obj[1]:"+obj[1]+")"+"-"+name);
        return obj;

    }


    public void writeCount(int[]a) throws InterruptedException {
        writeLock.lock();
        this.obj=a;
        System.out.println("获得写锁,写线程后:"+Thread.currentThread().getName()+"obj[0]:"+a[0]+",obj[1]:"+a[1]);
       writeLock.unlock();
    }

}

有加读锁:

 

没加锁的执行过程:

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值