java缓存及读写锁实例应用
Posted Torey_li
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java缓存及读写锁实例应用相关的知识,希望对你有一定的参考价值。
package com.thread.demo.lock; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; /** * * @author Torey * */ public class CacheDemo { // 创建一个缓存对象 static Map<String, Object> cache = Collections .synchronizedMap(new HashMap<>()); static ReadWriteLock rwLock = new ReentrantReadWriteLock(); /** * 定义一个获取数据的方法 * * @param key * @return */ public Object getData(String key) { // 开启读锁 rwLock.readLock().lock(); Object value = null; try { // 获取到缓冲对象中的数据 value = cache.get(key); if (value == null) { // 关闭读锁 rwLock.readLock().unlock(); // 开启 写锁 rwLock.writeLock().lock(); try { value = cache.get(key); if (value == null) { System.out.println("从DB获取数据:" + key); cache.put(key, key + "_key的值"); value = cache.get(key); } else { System.out.println("从缓存读取:"); value = cache.get(key); } } catch (Exception ex) { ex.printStackTrace(); } finally { // 释放写锁 rwLock.writeLock().unlock(); } // 释放读锁 rwLock.readLock().lock(); } else { System.out.println("从缓存读取"); value = cache.get(key); } } catch (Exception ex) { ex.printStackTrace(); } finally { // 关闭读锁 rwLock.readLock().unlock(); } return value; } static class CacheRunnable implements Runnable { @Override public void run() { // TODO Auto-generated method stub for (int i = 0; i < 3; i++) { System.out.println(Thread.currentThread().getName() + "_" + i+"="+new CacheDemo().getData(Thread.currentThread().getName() + "_" + i)); } } } public static void main(String[] args) { for (int i = 0; i < 3; i++) { new Thread(new CacheRunnable(), "线程").start(); } } }
以上是关于java缓存及读写锁实例应用的主要内容,如果未能解决你的问题,请参考以下文章
java中ReentrantReadWriteLock读写锁的使用
17---读写锁ReadwriteLock——实现一个完备的缓存