设计模式、用Delphi描述-->Lock pattern

原创 2001年10月26日 12:38:00

 

Lock pattern

起源<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

lock patternDelphi TStrings数据更新控制的基础。在本段后面将例举部分TstringsTstringList的代码

目的

为类提供一个临时的访问锁控制机制

动机

我们经常发现一个对象经常调度一个返回更改结果的通知。被调度的对象必须控制其内部状态,以同步对象数据。如果同时对一个对象进行多个更改操作,将会产生多个通知并产生一个并发的操作。此时在你的类中加入一个lock pattern的模式,从面提供一个临时锁控制机。从而避免不必要的通知。

我们通过Tbag类来学习:

TBag提供了collection的行为。每次更改Tbag将调度OnChange事件。如果我们一次对Tbag加入多个对象你将得到多个更改通知。一个图形组件可能会进行多次刷新操作。引入lock pattern在加入对象前打开Tbag的锁,操作完后关闭锁。如此,我将得到单一的更改通知。更好的办法是加入一个标志,比如:FUpdating

应用

以下是Tbag类部分代码: (仅显示部分相关代码)

 

type

  TBag = class (TObject)

  private

    FLockCnt: Integer;

  protected

    function Locked: Boolean;

    procedure SetLocking(Updating: Boolean);

  public

    procedure Lock;

    procedure UnLock;

  end;

 

implementation

 

procedure TBag.Lock;

begin

  Inc(FLockCnt);

  if FLockCnt = 1 then SetLocking(False);

end;

 

function TBag.Locked: Boolean;

begin

  Result := (FLockCnt <> 0);

end;

 

procedure TBag.SetLocking(Updating: Boolean);

begin

end;

 

procedure TBag.UnLock;

begin

  Dec(FLockCnt);

  if FLockCnt = 0 then SetLocking(True);

end;

 

Tbag说明:

·      FlockCnt保存锁机制的内部状态。FLockCnt = 0表示其处于非锁状态,其它值都表示其处于锁定状态。类Tbag通过LockUnlock来设置它的值。

·      LockUnlock提供了锁的接口,每一次调用都将引起锁的关态变化,并调用SetLocking方法。

·      SetLocking方法中有一个Updating的参数,Lock调用的参数为False,而Unlock调用的参数为True。对了,你可以在方法中插入一引起其它的代码,分配给它更多的操作表示它的锁状态的更改。.

·      Locked 返回类的锁状态。

注意:Lock Unlock必须同时使用,从而避免类保持在锁状态。明智的方法是使用try..finally块来保持Lock Unlock的同时调用。

 

一个典型的应用例子:

 

procedure TBag.Add(Item: Pointer);

begin

  { Add Item to internal structure }

  Change;

end

 

procedure TBag.AddItems(Items: TList);

begin

  Lock;

  { Add multiple items }

  try

    for I := 0 to Items.Count - 1 do

      Add(Items[I]);

  finally

    { use try..finally to make sure Unlock is called }

    Unlock;

  end;

end;

 

procedure TBag.Change;

begin

  if not Locked then

    if Assigned(FOnChange) then FOnChange(Self);

end;

 

procedure TBag.SetLocking(Updating: Boolean);

begin

  if Updating then { Bag has become unlocked }

    Change;

end;

Delphi实例:TStringTstringList

TStrings = class(TPersistent)

  private

FUpdateCount: Integer;

  Protected

procedure Exchange(Index1, Index2: Integer); virtual;

procedure SetUpdateState(Updating: Boolean); virtual;

public

  procedure BeginUpdate;

  procedure EndUpdate;

procedure Changed; virtual;

       procedure Changing; virtual;

开源项目源码解析-Android Lock Pattern 源码解析

Android Lock Pattern 源码解析 本文为 Android 开源项目源码解析 中 android-lockpattern 部分 项目地址:android-lockpattern...
  • ljx19900116
  • ljx19900116
  • 2015年02月04日 09:41
  • 4836

Pattern的简单使用

正则表达式:用符合一定规则的字符描述、匹配指定的字符串,来判定该字符串是否符合相应的语法规则.Java中使用...
  • gaohe1227
  • gaohe1227
  • 2015年08月09日 09:16
  • 387

结构模式(Structural Pattern)总结

结构模式(Structural Pattern)总结 结构模式(Structural Pattern)描述如何将类或者对象结合在一起形成更大的结构。结构模式描述两种不同的东西:类与类的实...
  • jiangxinyu
  • jiangxinyu
  • 2013年03月26日 10:33
  • 1365

描述C#多线程中 lock关键字

本文介绍C# lock关键字,C#提供了一个关键字lock,它可以把一段代码定义为互斥段(critical section),互斥段在一个时刻内只允许一个线程进入执行,而其他线程必须等待。   ...
  • yaozhichao1
  • yaozhichao1
  • 2013年10月21日 14:53
  • 294

装饰模式(Decorate Pattern)

装饰模式定义:装饰模式动态的将责任附加到对象上,若要扩展功能,装饰模式可以提供比继承更有弹性的替代方案。装饰模式分为3个部分:1,抽象组件 2,具体组件 3,装饰者。具体组件和装饰者都继承自抽象组件,...
  • a19881029
  • a19881029
  • 2013年05月28日 17:29
  • 12842

DELPHI编写服务程序总结

DELPHI编写服务程序总结 一、服务程序和桌面程序的区别 Windows 2000/XP/2003等支持一种叫做“系统服务程序”的进程,系统服务和桌面程序的区别是: 系统服务不用登陆系统即可运...
  • zisongjia
  • zisongjia
  • 2017年05月17日 09:15
  • 542

Delphi 实现卸载Windows应用程序(类似360软件管家-卸载程序)

摘要: 本文主要梳理的是实现卸载程序并等待卸载程序运行结束的方法,如果仅仅是调用卸载程序,相信难度也不大,但是我们需要等待卸载程序执行完毕,这就有些费脑筋了(是不是想到了360?没错,360也具有这个...
  • yueyun889
  • yueyun889
  • 2017年10月25日 15:06
  • 338

高德地图的使用

高德地图使用起来是多么的轻松加愉快啊。两二行代码,不实现代理,都可以简单地完成定位到你当前的位置。爽爆了。...
  • mjx342112780
  • mjx342112780
  • 2016年08月20日 11:23
  • 4525

Thread学习(六)读写锁的学习ReadWriterLock学习

Thread中读写锁 读写锁,分为读锁和写锁,多个读锁不互斥,读锁和写锁互斥,写锁和写锁互斥,其实很好理解,就是读的时候不能多线程去写,读的时候可以多线程去读,写的时候不能多线程去写。这是由jvm自...
  • a347911
  • a347911
  • 2016年11月22日 14:24
  • 696

Pattern用法(正则表达式)

1. 正则表达式的应用        在给用户发送消息时通常情况会有相同的消息模板,但其中部分信息跟用户相关,因此需要对消息模板中的变量部分进行替换。而对于一个系统而言可能有很多套完全不同的模板。因...
  • woniu317
  • woniu317
  • 2016年08月11日 21:21
  • 9686
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式、用Delphi描述-->Lock pattern
举报原因:
原因补充:

(最多只允许输入30个字)