`

用锁实现缓存机制

 
阅读更多
package test1;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;



/**
 * 通过锁,实现缓存机制
 * 伪代码
 * @author Administrator
 *
 */
public class CatchUsedLock {
	
	public static void main(String[] args) {
		
	}
	
	private Map<String, Object> map = new HashMap<String, Object>();
	
	// 此方法,多个线程进来,会多次操作数据库
	public void getData1 (String key) {
		if (map.get(key) == null) {
			map.put(key, "到数据库中取相关数值");
		}
	}
	
	
	// 此方法在读的时候被互斥,效率不高,按需求,只需要在写的时候互斥
	public synchronized void getData2 (String key) {
		if (map.get(key) == null) {
			map.put(key, "到数据库中取相关数值");
		}
	}
	
	// 应使用此方法
	private ReadWriteLock lock = new ReentrantReadWriteLock();
	public synchronized void getData3 (String key) {
		try {
			lock.readLock().lock();
			Object val = map.get(key);
			if (val == null) {
				lock.readLock().unlock();
				lock.writeLock().lock();
				// 此处还需再判断一次,防止当多个线程都被阻塞在lock.writeLock().lock();
				// 然后一个线程从数据库中取值后,走完,解锁,另一个线程进来发现是空的,又走一次数据库。
				val = map.get(key);
				if (val == null) {
					val = "到数据库中取相关数值";
					map.put(key, val);
				}
				lock.writeLock().unlock();
				lock.readLock().lock();
			}
		} finally {
			lock.readLock().unlock();
		}
	}
}

 

分享到:
评论

相关推荐

    Redis实现分布式锁(附源码+讲义)

    如果分布式环境下多个不同线程需要对共享资源进行同步,那么用Java的锁机制就无法实现了,这个时候就必须借助分布式锁来解决分布式环境下共享资源的同步问题。分布式锁有很多种解决方案,今天我们要讲的是怎么使用...

    C#线程锁介绍源码

    lock和Monitor是.NET用一个特殊结构实现的,Monitor对象是完全托管的、完全可移植的,并且在操作系统资源要求方 面可能更为有效,同步速度较快,但不能跨进程同步。lock(Monitor.Enter和Monitor.Exit方法的封装)...

    FreeBSD操作系统设计与实现

    6.4.4 文件描述符的上锁机制 6.4.5 描述符上的多路I/O操作 6.4.6 select调用的实现 6.4.7 数据在内核中的转移 6.5 虚拟文件系统的接口 6.5.1 vnode的内容 6.5.2 对vnode的操作 6.5.3 路径名转换 6.5.4 文件系统的...

    60道关于Redis的常见面试题.pdf

    你了解的分布式锁有哪些实现方式? - 6. Redis 的数据淘汰策略有哪些?分别是如何工作的? - 7. 什么是 Redis 事务?它是如何实现的?与传统数据库事务有何不同? - 8. 如何设置 Redis 的主从复制?主从复制有什么...

    Disruptor 一种可替代有界队列完成并发线程间数据交换高性能解决方案.docx

    Disruptor是一个高效的线程间交换数据的基础组件,它使用栅栏(barrier)+序号(Sequencing)机制协调生产者与消费者,从而避免使用锁和CAS,同时还组合使用预分配内存机制、缓存行机制(cache line)、批处理效应...

    xgnet oiocp(重叠完成端口) 封装库,网络引擎

    稳定易用的大容量 windows socket api 封装库,采用重叠完成端口模型实现,引擎采用异步消息控制,实现...引擎实现了统一的监听和连接机制,同一个实例可以同时开多个端口监听同时开多个连接,能够大大的方便用户的使用

    涵盖了90%以上的面试题

    hashmap的底层原理 ...使用AQS类实现可重入锁 CAS MySQL 中的行级锁、表级锁和页级锁 java中的死锁 公平锁和非公平锁 锁的总结 锁的优化 .......... 还有好多,不想写了,太多了,都是题主呕心沥血总结的

    云盒子 v4.0.1.8

    独家编辑锁机制实现多人接力编辑文件;首创的双模虚拟盘实现文件夹同步,与Windows系统无缝融合,操作云文件就像本地文件,让文件存取皆于云端。安全存储将文档数据存储在自己的设备中,拥有文档存储、分发的绝对...

    阿里巴巴,天猫,支付宝面试题

    17. zookeeper的实现机制,有缓存,如何存储注册服务的 18. IO会阻塞吗?readLine是不是阻塞的 19. 用过spring的线程池还是java的线程池? 20. 字符串的格式化方法 (20,21这两个问题问的太低级了) 21. 时间的格式...

    阿里百度美团面试题合集

    分布式相关:Redis 缓存、一致 Hash 算法、分布式存储、负载均衡等。 .. 微服务以及 Docker 容器等。 . ArrayList 和 LinkedList 底层 . HashMap 及线程安全的 ConcurrentHashMap,以及各自优劣势 . Java 如何实现...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     21.4.1 利用数据库系统的独占锁来实现悲观锁  21.4.2 由应用程序实现悲观锁  21.5 利用Hibernate的版本控制来实现乐观锁  21.5.1 使用元素  21.5.2 使用元素  21.5.3 对游离对象进行版本检查  21.5.4 强制...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     21.4.1 利用数据库系统的独占锁来实现悲观锁  21.4.2 由应用程序实现悲观锁  21.5 利用Hibernate的版本控制来实现乐观锁  21.5.1 使用元素  21.5.2 使用元素  21.5.3 对游离对象进行版本检查  21.5.4 强制...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     21.4.1 利用数据库系统的独占锁来实现悲观锁  21.4.2 由应用程序实现悲观锁  21.5 利用Hibernate的版本控制来实现乐观锁  21.5.1 使用元素  21.5.2 使用元素  21.5.3 对游离对象进行版本检查  21.5.4 强制...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     21.4.1 利用数据库系统的独占锁来实现悲观锁  21.4.2 由应用程序实现悲观锁  21.5 利用Hibernate的版本控制来实现乐观锁  21.5.1 使用元素  21.5.2 使用元素  21.5.3 对游离对象进行版本检查  21.5.4 强制...

    jim-framework:一些公共组件及学习应用:RPC统一配置中心基于注解的分布式锁dubbo请求级缓存调用链追踪RabbitMQElasticsearchzookeeperSping boot

    过滤器机制简易RPC框架-客户端限流配置简易RPC框架-上下文简易RPC框架-代理简易RPC框架-熔断降级机制简易RPC框架-SPI熔断降级实现影响上下文机制,后续更新解决基于注解的锁Spring boot实践WEBValidator (未同步...

    gameserver:gameserver 是一个分布式java游戏框架,基于Spring+netty+redis+自定义rpc(或者dubbo)+MyBatis + mysql(或者mongodb)实现

    socket通信实现,登录系统,玩家线程模型,db系统,分布式id生成器,分布式锁,缓存系统,热更新机制,rpc系统,全服组队等等组织结构gameserver├── client -- 测试用netty客户端├── rpc-api -- 提供分布式的rpc基础├...

    简易网银管理系统搭建过程与结果演示

    使用会话保存缓存信息。由于这是笔者第一次进行前后端项目设计,因此最终的功能实现仍有许多有待改进之处。比如,身份证号应为固定的18位;用户隐私的保护;转账失败的解决方法只进行了简单的判断(在SQL设计时对于...

    Java思维导图xmind文件+导出图片

    基于分布式架构下分布式锁的解决方案实战 分布式架构实现分布式定时调度 分布式架构-中间件 分布式消息通信 消息中间件在分布式架构中的应用 ActiveMQ ActiveMQ高可用集群企业及部署方案 ActiveMQ P2P及PUB/...

Global site tag (gtag.js) - Google Analytics