无缝缓存读取简化:仅Lambda表达式传递委托

之前写了一篇:无缝的缓存读取:双存储缓存策略,其中使用了两个存储地址交替提供缓存数据。

在其中用了两个存储指针转换以达到无缝读取缓存,在Cat Chen一语提醒之后,想了一想:的确是没 有必要在缓存中使用两个存储指针的,其实一个存储地址,只要保证写入时在其它线程就可以。

更改存储介质至以下两个属性:

namespace CHCache {
   /// <summary>
   /// 缓存介质
   /// </summary>
   public class Medium {
     /// <summary>
     /// 存储区
     /// </summary>
     public object Store { get; set; }
     /// <summary>
     /// 是否正在更新
     /// </summary>
     public bool IsUpdating { get; set; }
   }
}

这里存储区用于存储要缓存的实体内容,而IsUpdating则标识其是否正在更新。

对于缓存类,则更改了写入和读取方式。

/*
  * http://www.cnblogs.com/chsword/
  * chsword
  * Date: 2009-3-31
  * Time: 17:00
  * 
  */
using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading;

namespace CHCache {
   /// <summary>
   /// 双存储的类
   /// </summary>
   public class DictionaryCache : IEnumerable {
     /// <summary>
     /// 在此缓存构造时初始化字典对象
     /// </summary>
     public DictionaryCache() {
       Store = new Dictionary<string, Medium>();
     }
     public void Add(string key, Func<object> func) {
       if (Store.ContainsKey(key)) {//修改,如果已经存在,再次添加时则采用其它线程
         var elem = Store[key];
         if (elem.IsUpdating) return; //正在写入未命中
         var th = new ThreadHelper(elem, func);
         var td = new Thread(th.Doit);
         td.Start();
       }
       else {//首次添加时可能也要读取,所以要本线程执行
         Console.WriteLine("Begin first write");
         Store.Add(key, new Medium { Store = func() });
         Console.WriteLine("End first write");
       }

     }
     /// <summary>
     /// 读取时所用的索引
     /// </summary>
     /// <param name="key"></param>
     /// <returns></returns>
     public object this[string key] {
       get {
         if (!Store.ContainsKey(key)) return null;
         var elem = Store[key];
         return elem.Store;
       }
     }
     Dictionary<string, Medium> Store { get; set; }
     public IEnumerator GetEnumerator() {
       return ((IEnumerable)Store).GetEnumerator();
     }
   }
}

时间: 2024-09-30 09:52:53

无缝缓存读取简化:仅Lambda表达式传递委托的相关文章

一个关于C#的lambda表达式传递的问题

问题描述 一个关于C#的lambda表达式传递的问题 C#中如何让lambda表达式返回另一个lambda表达式?lambda表达式可以传递么? 解决方案 可以啊.lambda本身也是一个类型,所以也可以返回: Func<int, bool> MyAnd(Func<int, bool> f1, Func<int, bool> f2) { return x => f1(x) && f2(x); } 调用 Func<int, bool> f

Java8初体验(一)lambda表达式语法

感谢同事[天锦]的投稿.投稿请联系 tengfei@ifeve.com 本文主要记录自己学习Java8的历程,方便大家一起探讨和自己的备忘.因为本人也是刚刚开始学习Java8,所以文中肯定有错误和理解偏差的地方,希望大家帮忙指出,我会持续修改和优化.本文是该系列的第一篇,主要介绍Java8对屌丝码农最有吸引力的一个特性-lambda表达式. java8的安装 工欲善其器必先利其器,首先安装JDK8.过程省略,大家应该都可以自己搞定.但是有一点这里强调一下(Windows系统):目前我们工作的版本

转 Lambda表达式解析

(本文转载自:http://www.2cto.com/kf/201404/296631.html) Cocos 2d-x 3.0 版本中引入了C++ 11的特性.其中就包含了回调函中使用Lambda对象. Lambda表达式是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的Lambda抽象,是一个匿名函数,即没有函数名的函数. 下面我们来看一段TestCpp中的代码:   在上图的触摸事件的回调函数中,共使用了三次Lambda表达式: [ ](Touch * touch,

Java函数式编程(一):你好,Lambda表达式_java

第一章 你好,lambda表达式! 第一节 Java的编码风格正面临着翻天覆地的变化. 我们每天的工作将会变成更简单方便,更富表现力.Java这种新的编程方式早在数十年前就已经出现在别的编程语言里面了.这些新特性引入Java后,我们可以写出更简洁,优雅,表达性更强,错误更少的代码.我们可以用更少的代码来实现各种策略和设计模式. 在本书中我们将通过日常编程中的一些例子来探索函数式风格的编程.在使用这种全新的优雅的方式进行设计编码之前,我们先来看下它到底好在哪里. 改变了你的思考方式 命令式风格--

Lambda 表达式

Lambda 表达式(C# 编程指南) 更新:2007 年 11 月 "Lambda 表达式"是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型. 所有 Lambda 表达式都使用 Lambda 运算符 =>,该运算符读为"goes to".该 Lambda 运算符的左边是输入参数(如果有),右边包含表达式或语句块.Lambda 表达式 x => x * x 读作"x goes to x times x".可

C++中的数组array和vector,lambda表达式,C字符串加操作,C++中新类型数组(数组缓存),多元数组,new缓冲

 使用C++风格的数组,不需要管理内存. array要注意不要溢出,因为它是栈上开辟内存. array适用于任何类型 #include<iostream> #include<array> #include<vector>   //C++的标准库 #include<string>   //C++字符串 #include <stdlib.h>   using  std::array; //静态数组,栈上 using std::vector; //

探索Java语言与JVM中的Lambda表达式

Lambda表达式是自Java SE 5引入泛型以来最重大的Java语言新特性,本文是2012年度最后一期Java Magazine中的一篇文章,它介绍了Lamdba的设计初衷,应用场景与基本语法.(2013.01.07最后更新) Lambda表达式,这个名字由该项目的专家组选定,描述了一种新的函数式编程结构,这个即将出现在Java SE 8中的新特性正被大家急切地等待着.有时你也会听到人们使用诸如闭包,函数直接量,匿名函数,及SAM(Single Abstract Method)这样的术语.其

【转】【UNITY3D 游戏开发之七】C# 中的委托、事件、匿名函数、LAMBDA 表达式

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/unity3d-game/1613.html       Unity3d 开发中,常用的莫过于委托和事件了,所以转载一篇相关文章,写的比较详细的,这里分享一下.      对于匿名函数以及Lambda表达式也是非常常用的,这里就直接分享链接,童鞋们自行学习.     匿名函数.Lambda表达式:http://www.cnblogs.com/

在Java中使用Lambda表达式的技巧

在本文中,我们将展示一些在 Java 8 中不太为人所了解的 Lambda 表达式技巧及其使用限制.本文的主要的受众是 Java 开发人员,研究人员以及工具库的编写人员. 这里我们只会使用没有 com.sun 或其他内部类的公共 Java API,如此代码就可以在不同的 JVM 实现之间进行移植. 快速介绍 Lambda 表达式作为在 Java 8 中实现匿名方法的一种途径而被引入,可以在某些场景中作为匿名类的替代方案. 在字节码的层面上来看,Lambda 表达式被替换成了 invokedyna