博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程之ReadWriteLock模拟缓存(九)
阅读量:5055 次
发布时间:2019-06-12

本文共 5963 字,大约阅读时间需要 19 分钟。

错误案例1:

package com.net.thread.lock;import java.util.HashMap;import java.util.Map;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent.locks.ReentrantReadWriteLock;/** * @author  * @Time:2017年8月23日 下午6:09:20 * @version 1.0 * @description 读写锁模拟缓存技术 ,错误写法1 */public class Example{    public static void main(String[] args)    {        Demo demo = new Demo();        new Thread(new Runnable()        {            @Override            public void run()            {                System.out.println(demo.get("java"));            }        }).start();        new Thread(new Runnable()        {            @Override            public void run()            {                System.out.println(demo.get("java"));            }        }).start();    }    static class Demo    {        ReadWriteLock rwl = new ReentrantReadWriteLock();        Map
map = new HashMap
(); boolean flag; public Object get(Object key) { rwl.readLock().lock(); Object value = null; value = map.get(key); //if不安全,如果在这里边的value依旧是null,则根本没有安全保障 if (value == null) { flag = false; rwl.readLock().unlock(); rwl.writeLock().lock(); System.out.println(Thread.currentThread().getName() + " 的flag:" + flag); if (!flag) { value = null; map.put(key, value); flag = true; try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } rwl.writeLock().unlock(); rwl.readLock().lock(); } rwl.readLock().unlock(); return value; } }}

 

错误案例2: 在前一个案例中进行改造,但不完全;此例子中的flag是局部变量,而局部变量实际上是线程安全,就相当于每个线程开始都有一个flag=false的结果,因此,多次调用,多次初始化,并没有起到缓存的作用

package com.net.thread.lock;import java.util.HashMap;import java.util.Map;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent.locks.ReentrantReadWriteLock;/** * @author  * @Time:2017年8月23日 下午6:09:20 * @version 1.0 * @description 读写锁模拟缓存技术,错误写法2 */public class Example2{    public static void main(String[] args)    {        Demo demo = new Demo();        new Thread(new Runnable()        {            @Override            public void run()            {                System.out.println(demo.get("java"));            }        }).start();        new Thread(new Runnable()        {            @Override            public void run()            {                System.out.println(demo.get("java"));            }        }).start();    }    static class Demo    {        ReadWriteLock rwl = new ReentrantReadWriteLock();        Map
map = new HashMap
(); int i = 1; public Object get(Object key) { boolean flag = false; rwl.readLock().lock(); Object value = map.get(key); while (value == null) { System.out.println(Thread.currentThread().getName() + " 的flag:" + flag); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } rwl.readLock().unlock(); rwl.writeLock().lock(); if (!flag) { map.put(key, "初始化"); flag = true; System.out.println(Thread.currentThread().getName() + "写完后的flag :" + flag + " 次数:" + i); i++; } rwl.writeLock().unlock(); rwl.readLock().lock(); value = map.get(key); } rwl.readLock().unlock(); return value; } }}

 

正确写法:

package com.net.thread.lock;import java.util.HashMap;import java.util.Map;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent.locks.ReentrantReadWriteLock;/** * @author  * @Time:2017年8月23日 下午6:09:20 * @version 1.0 * @description 读写锁模拟缓存技术,正确写法 */public class Example3{    public static void main(String[] args)    {        Demo demo = new Demo();        new Thread(new Runnable()        {            @Override            public void run()            {                System.out.println(demo.get("java"));            }        }).start();        new Thread(new Runnable()        {            @Override            public void run()            {                System.out.println(demo.get("java"));            }        }).start();    }    static class Demo    {        ReadWriteLock rwl = new ReentrantReadWriteLock();        Map
map = new HashMap
(); int i = 1; boolean flag = false; public Object get(Object key) { rwl.readLock().lock(); Object value = map.get(key); while (value == null) { System.out.println(Thread.currentThread().getName() + " 的flag:" + flag); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } rwl.readLock().unlock(); rwl.writeLock().lock(); if (!flag) { map.put(key, "初始化"); flag = true; System.out.println(Thread.currentThread().getName() + "写完后的flag :" + flag + " 次数:" + i); i++; } rwl.writeLock().unlock(); rwl.readLock().lock(); value = map.get(key); } rwl.readLock().unlock(); return value; } }}

 

转载于:https://www.cnblogs.com/chen1-kerr/p/7421505.html

你可能感兴趣的文章
编写一个函数isMerge,判断一个字符串str是否可以由其他两个字符串part1和part2“组合”而成...
查看>>
文件操作
查看>>
NYOJ-613//HDU-1176-免费馅饼,数字三角形的兄弟~~
查看>>
graphite custom functions
查看>>
一个自己写的判断2个相同对象的属性值差异的工具类
查看>>
oracle连接的三个配置文件(转)
查看>>
Centos下源码安装git
查看>>
[置顶] 细说Cookies
查看>>
[wp7软件]wp7~~新闻资讯,阅读软件下载大全! 集合贴~~~
查看>>
二叉树的遍历问题总结
查看>>
聊天室(C++客户端+Pyhton服务器)_1.框架搭设
查看>>
pytho logging
查看>>
Python内置函数(29)——help
查看>>
对Feature的操作插入添加删除
查看>>
phpcms 添加自定义表单 留言
查看>>
oracle导出/导入 expdp/impdp
查看>>
JAVA 技术类分享(二)
查看>>
Objective - C基础: 第四天 - 10.SEL类型的基本认识
查看>>
数据结构之查找算法总结笔记
查看>>
Android TextView加上阴影效果
查看>>