package cn.itheima;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
public class CacheSystem
{
/**
面试题:设计一个缓存系统
缓存系统:你要取数据,需调用我的public Object getData(String key)方法,
我要检查我内部有没有这个数据,如果有就直接返回,如果没有,就从数据库中查找这个数,
查到后将这个数据存入我内部的存储器中,下次再有人来要这个数据,我就直接返回这个数
不用再到数据库中找了。 你要取数据不要找数据库,来找我。
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
//测试缓存器
final CacheSystem cache = new CacheSystem();
for (int i=0; i<3; i++)
{
new Thread(new Runnable()
{
public void run()
{
while (true)
{
int num = new Random().nextInt(10);
String key = num + "";
Object result = cache.get(key);
System.out.println(Thread.currentThread().getName()+"正在查询:"+key);
try
{
Thread.sleep(num*1000);
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"查询结果为:"+key+"="+result);
}
}
}).start();
}
}
//内部存储器
private Map<String, Object> cache = new HashMap<String, Object>();
//获取数据方法
//可能有多个线程来取数据,没有数据的话又会去数据库查询,需要互斥,加同步关键字即可
public Object get(String key)
{
//先从内部存储器中查有没有要的数据,查到直接返回
Object value = cache.get(key);
//如果没有查到,就去数据库中找
if (value==null)
{
//实际代码是从数据库中获取 queryDB()
value = key + "Value";
//将数据库中获取到的结果放入内部存储器中
cache.put(key, value);
}
return value;
}
}
/*
上面的get方法加synchronized后每次只能有一个线程来查询,但只有写的时候才需要互斥,修改如下
来一个读写锁
private ReadWriteLock rwl = new ReentrantReadWriteLock();
public Object get(String key)
{
上读锁
rwl.readLock().lock();
先查询内部存储器中有没有要的值
Object value = cache.get(key);
if (value==null)如果没有,就去数据库中查询,并将查到的结果存入内部存储器中
{
释放读锁 上写锁
rwl.readLock().unlock();
rwl.writeLock().lock();
if (value==null)再次进行判断,防止多个写线程堵在这个地方重复写
{
value = “aaaa”;
cache.put(key, value);
}
设置完成 释放写锁,恢复读写状态
rwl.readLock().lock();
rwl.writeLock().unlock();
}
释放读锁
rwl.readLock().unlock();
return value;
}注意:try finally中unlock
*/
没有合适的资源?快使用搜索试试~ 我知道了~
张孝祥Java多线程与并发库高级应用视频教程练习代码
共58个文件
class:41个
java:15个
project:1个
5星 · 超过95%的资源 需积分: 9 434 下载量 144 浏览量
2013-01-25
14:21:56
上传
评论 2
收藏 47KB RAR 举报
温馨提示
张孝祥Java多线程与并发库高级应用视频教程练习代码 自己根据视频内容练习写的源代码
资源推荐
资源详情
资源评论
收起资源包目录
Java多线程与并发库高级应用ThreadPool.rar (58个子文件)
ThreadPool
bin
cn
itheima
ThreadDemo$2.class 1KB
CopyOfTest2.class 2KB
ThreadLocalDemo.class 1KB
CacheSystem.class 2KB
ThreadScopeDataShare$B.class 1KB
ObjectCompare.class 2KB
CopyOfTest1.class 2KB
CopyOfTest3.class 2KB
ThreadInterViewTest.class 2KB
ThreadLocalShareDataDemo$MyData.class 1KB
ThreadLocalShareDataDemo$B.class 1KB
TraditionalTimerDemo$Task.class 824B
CacheSystem$1.class 2KB
ThreadScopeDataShare$1.class 2KB
ThreadLocalDemo$A.class 1KB
ReadWriteLockDemo$2.class 830B
ThreadScopeDataShare.class 1KB
TraditionalTimerDemo.class 1KB
ThreadLocalShareDataDemo$1.class 2KB
TestDo.class 1KB
ReadWriteLockDemo$1.class 756B
Test2.class 2KB
TestDo33.class 2KB
ReadWriteLockDemo.class 918B
ThreadDemo$1.class 1KB
ThreadLocalDemo$1.class 1KB
CopyOfTest1$1.class 995B
CopyOfTest2$1.class 1KB
TestDo3.class 2KB
ThreadDemo.class 686B
ReadWriteLockDemo$Source.class 2KB
Test1$1.class 966B
Test2$1.class 1KB
ThreadLocalDemo$B.class 1KB
CopyOfTest2$TestDo.class 1KB
Test3.class 2KB
ThreadScopeDataShare$A.class 1KB
ThreadLocalShareDataDemo$A.class 1KB
ThreadInterViewTest$1.class 609B
Test1.class 2KB
ThreadLocalShareDataDemo.class 868B
src
cn
itheima
CopyOfTest3.java 2KB
TraditionalTimerDemo.java 763B
ThreadLocalShareDataDemo.java 2KB
ThreadDemo.java 1KB
ThreadInterViewTest.java 920B
CopyOfTest1.java 1KB
ReadWriteLockDemo.java 2KB
Test3.java 2KB
ThreadLocalDemo.java 2KB
Test2.java 1KB
CacheSystem.java 3KB
ObjectCompare.java 765B
Test1.java 1KB
ThreadScopeDataShare.java 1KB
CopyOfTest2.java 2KB
.project 386B
.classpath 232B
共 58 条
- 1
luck638
- 粉丝: 13
- 资源: 19
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
前往页