赞
踩
ReadWriteLock是一个接口,只有一个实现类ReentrantReadWriteLock
读写锁:读的时候可以多线程同时读,写的时候只能有一个线程单独写,读的时候不允许写
读锁readLock即共享锁
写锁writeLock即独占锁
使用举例:
public class ReadWriteLockTest { public static void main(String[] args) { Data data = new Data(); // 多线程同时写 for (int i = 1;i <= 5;i++){ new Thread(()->{ data.write(); },String.valueOf(i)).start(); } // 多线程同时读 for (int i = 1;i <= 5;i++){ new Thread(()->{ data.read(); },String.valueOf(i)).start(); } } } // 资源类 class Data { private ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); //创建读写锁 // 写:写的时候只能有一个线程单独写 public void write(){ readWriteLock.writeLock().lock(); // 写锁加锁 try { System.out.println(Thread.currentThread().getName()+"正在写入"); TimeUnit.SECONDS.sleep(1); // 延时1秒 System.out.println(Thread.currentThread().getName()+"写入结束"); } catch (InterruptedException e) { e.printStackTrace(); } finally { readWriteLock.writeLock().unlock(); // 写锁解锁 } } // 读:读的时候可以多线程同时读 public void read(){ readWriteLock.readLock().lock(); // 读锁加锁 try { System.out.println(Thread.currentThread().getName()+"正在读取"); TimeUnit.SECONDS.sleep(1); // 延时1秒 System.out.println(Thread.currentThread().getName()+"读取结束"); }catch (InterruptedException e) { e.printStackTrace(); }finally { readWriteLock.readLock().unlock(); // 读锁解锁 } } }
结果:
2正在写入 2写入结束 1正在写入 1写入结束 4正在写入 4写入结束 3正在写入 3写入结束 5正在写入 5写入结束 1正在读取 2正在读取 3正在读取 4正在读取 5正在读取 1读取结束 2读取结束 5读取结束 4读取结束 3读取结束
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。