1. 程式人生 > 其它 >ReadWriteLock 讀寫鎖

ReadWriteLock 讀寫鎖

技術標籤:多執行緒與高併發

                           ReadWriteLock 讀寫鎖
package com.qqjx.thread;

import java.util.Random;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/* * 互斥鎖 排他鎖 與讀寫鎖 * */ public class T10_TestReadWriteLock { static Lock lock = new ReentrantLock(); private static int value; static ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); static Lock readLock = readWriteLock.readLock(); static Lock writeLock = readWriteLock.
writeLock(); public static void read(Lock lock) { try { lock.lock(); Thread.sleep(1000); System.out.println("read over!"); //模擬讀取操作 } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.
unlock(); } } public static void write(Lock lock, int v) { try { lock.lock(); Thread.sleep(1000); value = v; System.out.println("write over!"); //模擬寫操作 } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } public static void main(String[] args) { /* * 第一次 使用 ReentrantLock 是互斥鎖也是排他鎖 程式在呼叫的過程中 每個執行緒在讀寫 * 的過程中 只能這個執行緒執行完釋放這個鎖的時候 才可以讓其他的讀寫執行緒執行程式 * 故在這18個讀執行緒和2個寫執行緒的執行時間是20秒 * 第二次 使用 ReadWriteLock 是讀寫鎖 讀的執行緒在執行的情況下 其他讀執行緒均可以執行 * 而寫執行緒不能執行 但是寫執行緒的在執行的過程 其他的讀寫執行緒均不可以操作 故效率更高 * */ //Runnable readR = ()-> read(lock); Runnable readR = ()-> read(readLock); //Runnable writeR = ()->write(lock, new Random().nextInt()); Runnable writeR = ()->write(writeLock, new Random().nextInt()); for(int i=0; i<18; i++) new Thread(readR).start(); for(int i=0; i<2; i++) new Thread(writeR).start(); } }
read over!
read over!
read over!
read over!
read over!
read over!
read over!
read over!
read over!
read over!
read over!
read over!
read over!
read over!
read over!
read over!
read over!
read over!
write over!
write over!