java并发编程-读写锁
2016-06-12 14:36
513 查看
最近项目中需要用到读写锁
读写锁适用于读操作多,写操作少的场景,假设你的程序中涉及到对一些共享资源的读和写操作,且写操作没有读操作那么频繁。在没有写操作的时候,两个线程同时读一个资源没有任何问题,所以应该允许多个线程能在同时读取共享资源。但是如果有一个线程想去写这些共享资源,就不应该再有其它线程对该资源进行读或写,也就是说 读-读能共存,读-写不能共存,写-写不能共存
我们直接使用java的读写锁 ReadWriteLock
如下代码是使用缓存的典型场景:
下面这篇文章写得比较详细:
http://ifeve.com/read-write-locks/
读写锁适用于读操作多,写操作少的场景,假设你的程序中涉及到对一些共享资源的读和写操作,且写操作没有读操作那么频繁。在没有写操作的时候,两个线程同时读一个资源没有任何问题,所以应该允许多个线程能在同时读取共享资源。但是如果有一个线程想去写这些共享资源,就不应该再有其它线程对该资源进行读或写,也就是说 读-读能共存,读-写不能共存,写-写不能共存
我们直接使用java的读写锁 ReadWriteLock
如下代码是使用缓存的典型场景:
public class ReadWriteLockTest { private static ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); private static LoadingCache<Long, LinkModel> windowCache = CacheBuilder .newBuilder() .expireAfterWrite(Config.ALL_RELOAD_CYCLE+1,TimeUnit.HOURS) //写入ALL_RELOAD_CYCLE小时后remove掉 .build(new CacheLoader<Long, LinkModel>() { @Override public LinkModel load(Long key) throws Exception { return LinkModelDAO.getLinkModelWindow(key); } }); public static LinkModel getLinkModelWindow(long linkId) { try { readWriteLock.readLock().lock(); LinkModel model = windowCache.get(linkId); return model; } catch (ExecutionException e) { LOGGER.error(e.getMessage(), e); }finally { readWriteLock.readLock().unlock(); } return null; } public static void refershModelWindowCache(String partitionId){ try { readWriteLock.writeLock().lock(); HashMap<Long, LinkModel> linkModelHashMap = LinkModelDAO.getLinkModelWindowsByPartition(partitionId,Config.ALL_ROADCLASS_LIST); if(MapUtils.isNotEmpty(linkModelHashMap)){ windowCache.cleanUp(); windowCache.putAll(linkModelHashMap); } } catch (EventMiningException e) { LOGGER.error(e.getMessage(), e); }finally { readWriteLock.writeLock().unlock(); } } }
下面这篇文章写得比较详细:
http://ifeve.com/read-write-locks/
相关文章推荐
- 文件无法删除java.io.IOException: Unable to delete
- 深入分析JavaWeb 51 -- Spring依赖注入
- Java编程开发设计模式之--单例模式(Singleton)
- Java获取路径方法&相对路径读取xml文件方法
- 怎么阻止内存泄漏
- 深入分析JavaWeb 50 -- Spring开发入门
- 开源E框架(Bootstrap,spring boot)
- SPRING MVC 配置<MVC:RESOURCES/> 导致@CONTROLLER失效
- Class类与JAVA反射
- java.lang.outofmemoryerror:permgen space
- Java—恶心的java.lang.NumberFormatException解决
- Eclipse从本地压缩包安装插件
- spring security(六)
- eclipse, Log4j配置(真心的详细~)
- [LeetCode][11]Container With Most Water解析 时间复杂度为O(n) -Java实现
- Java创建线程的两个方法
- Android Eclipse安装Ant插件
- java.lang.OutOfMemoryError: PermGen space
- JAVA Calendar详解(转)
- Java WebService 简单实例