java 之 读写锁 线程间互斥

来源:互联网 发布:windows10怎么切换mac 编辑:程序博客网 时间:2024/06/06 02:27
import java.util.Random;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent.locks.ReentrantReadWriteLock;/** * 线程间互斥 * @author ETHAN * */public class ReadWriteLockTest {public static void main(String[] args) {final Queue3 q3 = new Queue3();for(int i=0;i<3;i++) {//三个读的线程new Thread() {public void run() {while(true) {q3.get();}}}.start();//三个写的线程new Thread() {public void run() {while(true) {q3.put(new Random().nextInt(100000));}}}.start();}}}/** * 读和写要互斥,放在一个类里 * 读锁 不互斥,读和写锁互斥,写写锁互斥 * @author ETHAN * */class Queue3 {private Object data = null;//共享数据//不能用Lock,得用他的子类private ReadWriteLock rwl = new ReentrantReadWriteLock();public void get() {rwl.readLock().lock();try {System.out.println(Thread.currentThread().getName()+ " be ready to read data!");Thread.sleep((long)(Math.random()*1000));System.out.println(Thread.currentThread().getName()+" have read data: "+data);} catch (Exception e) {e.printStackTrace();} finally {rwl.readLock().unlock();}}public void put(Object data) {rwl.writeLock().lock();try {System.out.println(Thread.currentThread().getName()+ " be ready to write data!");Thread.sleep((long)(Math.random()*1000));this.data = data;System.out.println(Thread.currentThread().getName()+" have write data: "+data);} catch (Exception e) {e.printStackTrace();} finally {rwl.writeLock().unlock();}}}


import java.util.HashMap;import java.util.Map;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent.locks.ReentrantReadWriteLock;/** * 缓存系统 * @author ETHAN * */public class CacheDemo {private Map<String,Object> cache = new HashMap<String, Object>();public static void main(String[] args) {}private ReadWriteLock rwl = new ReentrantReadWriteLock();public Object getData(String key) {rwl.readLock().lock();Object value = null;try {value = cache.get(key);if(value==null) {rwl.readLock().unlock();//挂上写锁,查数据rwl.writeLock().lock();try {//再检查一次,防止其他线程,因为都可读,不互斥if(value==null) {value = "xxx";//query db}} finally {rwl.readLock().lock();//downgrade by acquiring the readlockrwl.writeLock().unlock();//有一种更新锁}} } finally {rwl.readLock().unlock();}return value;}}