赞
踩
2. ReadWriteLock应用
- package rw;
-
- import java.util.HashMap;
- import java.util.Map;
- import java.util.concurrent.locks.ReadWriteLock;
- import java.util.concurrent.locks.ReentrantReadWriteLock;
-
- /**
- *
- * 独占锁(写锁):一次只能被一个线程占用
- * 共享锁(读锁):多个线程可以同时占有
- *
- * ReadWriteLock
- * 读,读可以共存
- * 读,写不可共存
- * 写,写不可共存
- * @author Admin
- *
- */
- public class ReadWriteLockDemo {
-
- public static void main(String[] args) {
- // MyCache myCacheLock = new MyCache();
- MyCacheLock myCacheLock = new MyCacheLock();
-
- // 写入
- for (int i = 1; i <= 5; i++) {
- final int temp = i;
- new Thread(() -> {
- myCacheLock.put(temp + "", temp + "");
- },String.valueOf(i)).start();
- }
-
- // 读取
- for (int i = 1; i <= 5; i++) {
- final int temp = i;
- new Thread(() -> {
- myCacheLock.get(temp + "");
- },String.valueOf(i)).start();
- }
- }
- }
-
- class MyCacheLock {
- private volatile Map<String, Object> map = new HashMap<>();
- // 读写锁,更加细粒度的控制
- private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
-
- // 存,写,只能一个线程进入
- public void put(String key, Object value) {
- readWriteLock.writeLock().lock();
- try {
- System.out.println(Thread.currentThread().getName() + "写入" + key);
- map.put(key, value);
- System.out.println(Thread.currentThread().getName() + "写入ok");
- } finally {
- readWriteLock.writeLock().unlock();
- }
-
- }
-
- // 取,读,所有人都可以读
- public void get(String key) {
- readWriteLock.readLock().lock();
- try {
- System.out.println(Thread.currentThread().getName() + "读取" + key);
- Object object = map.get(key);
- System.out.println(Thread.currentThread().getName() + "读取ok");
- } finally {
- readWriteLock.readLock().unlock();
- }
-
- }
- }
-
- //自定义缓存
- class MyCache {
- private volatile Map<String, Object> map = new HashMap<>();
-
- // 存,写
- public void put(String key, Object value) {
- System.out.println(Thread.currentThread().getName() + "写入" + key);
- map.put(key, value);
- System.out.println(Thread.currentThread().getName() + "写入ok");
- }
-
- // 取,读
- public void get(String key) {
- System.out.println(Thread.currentThread().getName() + "读取" + key);
- Object object = map.get(key);
- System.out.println(Thread.currentThread().getName() + "读取ok");
- }
- }
控制台
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。