你需要实现一个高效的缓存,它允许多个用户读,但只允许一个用户写

思路:java.util.concurrent.locks包下面ReadWriteLock接口,该接口下面的实现类ReentrantReadWriteLock维护了两个锁读锁和解锁,可用该类实现这个功能,很简单

import java.util.Date;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * 你需要实现一个高效的缓存,它允许多个用户读,但只允许一个用户写,以此来保持它的完整性,你会怎样去实现它?
 * @author user
 *
 */
public class Test2 {

	public static void main(String[] args) {
		for (int i = 0; i < 3; i++) {
			new Thread(new Runnable() {

				@Override
				public void run() {
					MyData.read();
				}
			}).start();
		}
		for (int i = 0; i < 3; i++) {
			new Thread(new Runnable() {

				@Override
				public void run() {
					MyData.write("a");
				}
			}).start();
		}
	}
}

class MyData{
	//数据
	private static String data = "0";
	//读写锁
	private static ReadWriteLock rw = new ReentrantReadWriteLock();
	//读数据
	public static void read(){
		rw.readLock().lock();
		System.out.println(Thread.currentThread()+"读取一次数据:"+data+"时间:"+new Date());
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		} finally {
			rw.readLock().unlock();
		}
	}
	//写数据
	public static void write(String data){
		rw.writeLock().lock();
		System.out.println(Thread.currentThread()+"对数据进行修改一次:"+data+"时间:"+new Date());
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		} finally {
			rw.writeLock().unlock();
		}
	}
}

运行结果如下:

Thread[Thread-5,5,main]对数据进行修改一次:a时间:Sun Sep 10 20:52:07 CST 2017
Thread[Thread-4,5,main]对数据进行修改一次:a时间:Sun Sep 10 20:52:08 CST 2017
Thread[Thread-3,5,main]对数据进行修改一次:a时间:Sun Sep 10 20:52:09 CST 2017
Thread[Thread-2,5,main]读取一次数据:0时间:Sun Sep 10 20:52:10 CST 2017
Thread[Thread-0,5,main]读取一次数据:0时间:Sun Sep 10 20:52:10 CST 2017
Thread[Thread-1,5,main]读取一次数据:0时间:Sun Sep 10 20:52:10 CST 2017

分析结果可知:读取的时候都是同一个时间,而修改数据是不同时间的

时间: 2024-10-24 18:55:29

你需要实现一个高效的缓存,它允许多个用户读,但只允许一个用户写的相关文章

写一个高效的缓存组件(对象池)

我们在写高效服务时,许多需要缓存,一般缓存组件都需要加锁,我最近想了一个方法,感觉还不错,分享一下.直接上代码: public abstract class SimpleObjPool<T> { int _locker = 0; int _cnt = 0; T[] _ts; public SimpleObjPool(int MaxSize) { _ts = new T[MaxSize]; } protected abstract T NewObj(); public T GetObj() {

如何构建一个高效且可伸缩的缓存

本集概要: 怎样构建一个线程安全而又高效.可伸缩的缓存? 怎样利用设计模式,把缓存做成通用的工具? 除了synchronize和volatile,我们还能使用哪些工具来开发线程安全的代码? 一.糙版缓存 一天,哆啦对大雄说,"大雄,你看我们后台这个统计用户消费信息的报表,每次统计都要去查数据库,既消耗资源,查询起来也慢,你看看能不能给做一个缓存?" "缓存?这个简单呀,缓存的原理其实就是一个键值对,也就是Map,只要把用户的id作为key,把对应的统计结果作为value,放到

[Java并发编程实战]构建一个高效可复用缓存程序(含代码)

[Java并发编程实战]构建一个高效可复用缓存程序(含代码) 原文地址:https://www.cnblogs.com/chengpeng15/p/9915800.html

Android:一个高效的UI才是一个拉风的UI(二)

趁今晚老大不在偷偷早下班,所以有时间继续跟大伙扯扯UI设计之痛,也算一个是对上篇<Android:一个高效的UI才是一个拉风的UI(一)>的完整补充吧.写得不好的话大家尽管拍砖~(来!砸死我把~) 前言 前篇博客翻箱倒柜的介绍了优化UI设计的两个方法,第一个就是使用尽量少的组件来实现布局功能,第二个就是使用<meger>标签来减少不必要的根节点,这两个方法都可以提高应用UI的运行效率,但是够了吗?远远是不够的,方法就像money一样永远不嫌多,所以不再介绍多一些UI设计优化的方法说

通过Vim+少量插件配置一个高效简洁的IDE

最近本人在看<TCP/IP Illustrated Volume2:The Implementation>这本书,自然要下载4.4BSD-Lite的源代码配合书本一起研读.以前学习Vim的时候就知道Vim可以通过插件的功能来配置一个功能强大的自定义IDE,这次有这么好的机会为什么不利用一下呢?于是在阅读源代码的过程中根据需要一步一步配置了一个简单完整的IDE环境,通过这几天的使用真心觉得Vim好用,速度那个快呀.以前总听别人说Vim如何如何好,这次真的让我感受到了并爱上了Vim这个工具.在这里

哪种缓存效果高?开源一个简单的缓存组件j2cache

背景 现在的web系统已经越来越多的应用缓存技术,而且缓存技术确实是能实足的增强系统性能的.我在项目中也开始接触一些缓存的需求. 开始简单的就用jvm(java托管内存)来做缓存,这样对于单个应用服务器来说很好. 为了系统的可用性,需要做灾备,那么就要多准备一套系统环境,这时就会有一些共享资源的问题,比如Tomcat的session共享出来 几个系统会公用一套缓存数据,这样就变成一个共享池 需求的增长也就带来了系统的变化,也正为这种变化我开始思考怎么让这些代码兼容,并为以后的系统模块提供比较统一

Spark:一个高效的分布式计算系统

http://tech.uc.cn/?p=2116 概述 什么是Spark Spark是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用的并行计算框架,Spark基于map reduce算法实现的分布式计算,拥有Hadoop MapReduce所具有的优点:但不同于MapReduce的是Job中间输出和结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的map reduce的算法.其架构如下图所示: Sp

Spark:一个高效的分布式计算系统--转

原文地址:http://soft.chinabyte.com/database/431/12914931.shtml 概述 什么是Spark ◆ Spark是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用的并行计算框架,Spark基于map reduce算法实现的分布式计算,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是Job中间输出和结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机

[email&#160;protected]一个高效的配置管理工具--Ansible configure management--翻译(六)

无书面许可请勿转载 高级playbook Finding files with variables All modules can take variables as part of their arguments by dereferencing them with {{ and }} . You can use this to load a particular file based on a variable. For example, you might want to select a