自嗨ReentrantReadWriteLock
2020-12-21 10:12 hikoukay 阅读(190) 评论(0) 编辑 收藏 举报import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.locks.ReentrantReadWriteLock; public class AReentrantReadWriteLock { static ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); public static void main(String[] args) throws InterruptedException { // deadLock(); // releaseLock(); // upGradLock(); // downGrad(); // testSync(); // testRWL(); // readWriteSameTime(); // writeWriteSameTime(); readReadSameTime(); } /** * 同时读测试 */ public static void readReadSameTime(){ ExecutorService service= Executors.newCachedThreadPool(); service.execute(new Runnable() { @Override public void run() { readFile(Thread.currentThread()); } }); service.execute(new Runnable() { @Override public void run() { readFile(Thread.currentThread()); } }); } /** * 同时写测试 */ public static void writeWriteSameTime(){ ExecutorService service= Executors.newCachedThreadPool(); service.execute(new Runnable() { @Override public void run() { writeFile(Thread.currentThread()); } }); service.execute(new Runnable() { @Override public void run() { writeFile(Thread.currentThread()); } }); } /** * 同时读写测试 */ public static void readWriteSameTime(){ ExecutorService service= Executors.newCachedThreadPool(); service.execute(new Runnable() { @Override public void run() { writeFile(Thread.currentThread()); } }); service.execute(new Runnable() { @Override public void run() { readFile(Thread.currentThread()); } }); } // 读操作 public static void readFile(Thread thread) { lock.readLock().lock(); boolean readLock = lock.isWriteLocked(); if (!readLock) { System.out.println("当前为读锁!"); } try { for (int i = 0; i < 5; i++) { try { Thread.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(thread.getName() + ":正在进行读操作……"); } System.out.println(thread.getName() + ":读操作完毕!"); } finally { System.out.println("释放读锁!"); lock.readLock().unlock(); } } // 写操作 public static void writeFile(Thread thread) { lock.writeLock().lock(); boolean writeLock = lock.isWriteLocked(); if (writeLock) { System.out.println("当前为写锁!"); } try { for (int i = 0; i < 5; i++) { try { Thread.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(thread.getName() + ":正在进行写操作……"); } System.out.println(thread.getName() + ":写操作完毕!"); } finally { System.out.println("释放写锁!"); lock.writeLock().unlock(); } } /** * 测试读写锁同时执行 */ public static void testRWL(){ new Thread(new Runnable() { @Override public void run() { getRWL(Thread.currentThread()); } }).start(); new Thread(new Runnable() { @Override public void run() { getRWL(Thread.currentThread()); } }).start(); } /** * ReentrantReadWriteLock * @param thread */ public static void getRWL(Thread thread) { lock.readLock().lock(); System.out.println("start time:" + System.currentTimeMillis()); for (int i = 0; i < 5; i++) { try { Thread.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(thread.getName() + ":正在进行读操作……"); } System.out.println(thread.getName() + ":读操作完毕!"); System.out.println("end time:" + System.currentTimeMillis()); lock.readLock().unlock(); } public static void testSync(){ new Thread(new Runnable() { @Override public void run() { getSync(Thread.currentThread()); } }).start(); new Thread(new Runnable() { @Override public void run() { getSync(Thread.currentThread()); } }).start(); } /** * synchronized实现读写锁 * @param thread */ public synchronized static void getSync(Thread thread) { System.out.println("start time:" + System.currentTimeMillis()); for (int i = 0; i < 5; i++) { try { Thread.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(thread.getName() + ":正在进行读操作……"); } System.out.println(thread.getName() + ":读操作完毕!"); System.out.println("end time:" + System.currentTimeMillis()); } /** * 锁降级 * ReentrantReadWriteLock支持锁降级 */ public static void downGrad(){ ReentrantReadWriteLock rtLock = new ReentrantReadWriteLock(); rtLock.writeLock().lock(); System.out.println("writeLock"); rtLock.readLock().lock(); System.out.println("get read lock"); } /** * 锁升级 * ReentrantReadWriteLock不支持锁升级 */ public static void upGradLock(){ ReentrantReadWriteLock rtLock = new ReentrantReadWriteLock(); rtLock.readLock().lock(); System.out.println("get readLock."); rtLock.writeLock().lock(); System.out.println("blocking"); } /** * 死锁 * 获得几次锁,就要释放几次锁 * @throws InterruptedException */ public static void deadLock() throws InterruptedException { Thread t = new Thread(new Runnable() { @Override public void run() { lock.writeLock().lock(); System.out.println("Thread real execute"); lock.writeLock().unlock(); } }); lock.writeLock().lock(); lock.writeLock().lock(); t.start(); Thread.sleep(200); System.out.println("realse one once"); lock.writeLock().unlock(); } /** * 解锁 * 获得几次锁,就要释放几次锁 * @throws InterruptedException */ public static void releaseLock() throws InterruptedException { Thread t = new Thread(new Runnable() { @Override public void run() { lock.writeLock().lock(); System.out.println("Thread real execute"); lock.writeLock().unlock(); } }); lock.writeLock().lock(); lock.writeLock().lock(); t.start(); Thread.sleep(200); System.out.println("realse one once"); lock.writeLock().unlock(); lock.writeLock().unlock(); } }