你需要实现一个高效的缓存,它允许多个用户读,但只允许一个用户写
2017-09-10 20:58
811 查看
思路: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分析结果可知:读取的时候都是同一个时间,而修改数据是不同时间的
相关文章推荐
- 编程:实现一个高效的缓存系统?
- 用户在文本框中输入需要转换的十进制数,通过点击3个按钮在标签中显示结果。(点击一个实现一个)
- stream_register_wrapper 注册一个用 PHP 类实现的 URL 封装协议 允许用户实现自定义的协议处理器和流
- 如何使用Future和ConcurrentHashMap实现一个线程安全且高效的缓存
- 需要实现对一个字符串的处理,首先将该字符串首尾的空格去掉,如果字符串中间还有连续空格的话,仅保留一个空格,即允许字符串中间有多个空格,但连续的空格数不可超过一个
- 这是一个秒杀系统,即大量用户抢有限的商品,先到先得 用户并发访问流量非常大,需要分布式的机器集群处理请求 系统实现使用Java
- c#如何实现一个线程暂停,等待用户输入文本后继续运行?
- unserialize的这个问题是由一个emlog论坛用户在使用时报错而发现的 问题表现情况如下: emlog缓存的保存方式是将php的数据对象(数组)序列化(serialize)后以文件的形式存放,
- 一个木马需要实现的功能
- asp.net实现一个用户进行注册的时候同时发送一个邮件到注册人的邮箱,通过发送的邮箱链接来激活该帐号
- 连接共享文件夹时报错:发生系统错误 1219:不允许一个用户使用一个以上用户名与服务器或共享资源的多重连接
- 编写一个学生信息系统的菜单程序,在菜单其中的增加记录的菜单选项中实现对一条学生记录的录入,记录中需要有学号、姓名、性别,年龄籍贯等字段,要求用最合适的控件录入。
- 一个简单的PHP缓存思路的实现
- C++实现一个线程安全且高效单例类。(懒汉与饿汉)
- 要实现读写分离需要根据用户的操作连接不同的数据库
- 实现的不让同一个用户登陆
- 使用go语言的list实现一个简单的LRU缓存
- jquery.SuperSlide.js只需要调用一个插件就能实现网页大部分特效--推荐
- java一个实现实例缓存的不可变类
- ASP程序中同一个用户不允许同时登陆两次