ReadWriteLock读写锁

ReadWriteLock管理的是一组锁,一个是读锁,一个是写锁。

当前两个锁是同时使用的。

其实很多人能理解写锁,因为写锁的话,写如果并发的话,那就出现脏数据。

不过为什么会存在读锁?读为什么要锁?

其实数据有完整性。

比如:

public class Man {


    public String name = "0";
    public String age = "18";


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
}
public class MutilThread {
    private static Man man = new Man();
    public static ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
    private static Lock writeLock = lock.writeLock();
    private static Lock readLock = lock.readLock();
    public static void main(String[] args)   {
        ExecutorService service = Executors.newFixedThreadPool(20);
        service.execute(new Runnable() {
            @Override
            public void run() {
                read();
            }
        });
        for (int i = 0; i < 30; i++) {
            service.execute(new Runnable() {
                @Override
                public void run() {
                    write();
                }
            });
        }
    }

    public static  void read(){
        while (true){
            readLock.lock();
            Thread thread = Thread.currentThread();
            System.out.println("thread name "+thread.getName()+",man name  = " + man.name+"  age : "+ man.age);
            if (man.name.equals( "余")&&man.age.equals("22")){
                            System.out.println("1+thread name "+thread.getName()+",man name  = " + man.name+"  age : "+ man.age);
            }
            if (man.name.equals( "小明")&&man.age.equals("18")){
                System.out.println("2+thread name "+thread.getName()+",man name  = " + man.name+"  age : "+ man.age);
            }
            readLock.unlock();
        }
    }
    public static void write() {
        while (true) {
            writeLock.lock();
            Thread thread = Thread.currentThread();
            if (thread.getId()%2!=0){
                man.name = "余";
                man.age = "18";
//                System.out.println("thread name "+thread.getName()+",man name  = " + man.name+"  age : "+ man.age);
            }
            if (thread.getId()%2!=1){
                man.name = "小明";
                man.age = "22";
//                System.out.println("thread name "+thread.getName()+",man name  = " + man.name+"  age : "+ man.age);
            }
            writeLock.unlock();
        }
    }
}

存在两个成员变量,如果我们读的时候,如果只是写加了锁,读没有加读锁的话,你会发现读的时候没有读完整,会出现读的脏数据。比如出现余 22岁的这个情况是不应该出现的。所以读锁是保证读取的数据的完整性的。

猜你喜欢

转载自blog.csdn.net/ykp92/article/details/83546960