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岁的这个情况是不应该出现的。所以读锁是保证读取的数据的完整性的。