首先要了解独占锁和共享锁
- 独占锁:一次只能被一个线程占用
- 共享锁:多个线程可以同时占用
java.util.concurrent.locks.ReadWriteLock就是使用了独占锁和共享锁,实现了读写的控制
Demo如下:
public class ReadWriterLockDemo { public static void main(String[] args) { MyCacah myCacah = new MyCacah(); //写入 for (int i = 0; i < 6; i++) { final int temp = i; new Thread(()->{ myCacah.put(temp+"",temp+""); },String.valueOf(i)).start(); } //读取 for (int i = 0; i < 6; i++) { final int temp = i; new Thread(()->{ myCacah.get(temp+""); },String.valueOf(i)).start(); } } } class MyCacah{ private Map<String,String> map = new HashMap<>(); ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); //写入 public void put(String key,String value){ readWriteLock.writeLock().lock(); try { System.out.println(Thread.currentThread().getName() + "写入" + key); map.put(key,value); System.out.println(Thread.currentThread().getName() + "写入完毕"); } catch (Exception e) { e.printStackTrace(); } finally { readWriteLock.writeLock().unlock(); } } //读取 public void get(String key){ readWriteLock.readLock().lock(); try { System.out.println(Thread.currentThread().getName() + "读取" + key); map.get(key); System.out.println(Thread.currentThread().getName() + "读取完毕"); } catch (Exception e) { e.printStackTrace(); } finally { readWriteLock.readLock().unlock(); } } }
通过运行结果可知,写入操作是有序的,而读取的操作是无序的,也就是说,写入时独占锁,读取是共享锁