TP5+layui多檔案上傳,前端後臺程式碼案例
阿新 • • 發佈:2022-03-18
ReentrantReadWriteLock//讀寫鎖, 只能單執行緒寫,允許多執行緒讀
ReadWriteLock
讀-讀可以共存!
讀-寫不能共存!
寫-寫不能共存!
package Lock; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; /** ReentrantReadWriteLock//讀寫鎖, 只能單執行緒寫,允許多執行緒讀 * @author liu */ public class ReadWriteLockA { public static void main(String[] args) { MyCacheLock myCacheLock = new MyCacheLock(); for (int i = 1; i <= 5; i++) { int finalI = i; new Thread(() -> { myCacheLock.writer(finalI,finalI); }, String.valueOf(i)).start(); } for (int i = 1; i <= 5; i++) { int finalI = i; new Thread(() -> { myCacheLock.read(finalI); }, String.valueOf(i)).start(); } } } class MyCacheLock { private volatile Map<Integer, Object> map = new HashMap<>(); //讀寫鎖, 只能單執行緒寫,允許多執行緒讀 private ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); public void writer(Integer key, Object value) { try { readWriteLock.writeLock().lock(); System.out.println(Thread.currentThread().getName() + "寫入" + key); map.put(key, value); System.out.println(Thread.currentThread().getName() + "寫入OK"); } catch (Exception e) { e.printStackTrace(); } finally { readWriteLock.writeLock().unlock(); } } public void read(Integer key) { try { readWriteLock.readLock().lock(); System.out.println(Thread.currentThread().getName() + "讀取" + key); map.get(key); TimeUnit.SECONDS.sleep(1); System.out.println(Thread.currentThread().getName() + "讀取OK"); } catch (Exception e) { e.printStackTrace(); } finally { readWriteLock.readLock().unlock(); } } }