序言
所谓设计模式,不过是人们在编程活动中总结出来的一些常用的、有效的解决方法而已。自从我开始接触设计后,我就时常留意自己的常用的解决方案,希望能将这些解决方法抽象出来,形成模式。现在这一系列文章,是我这几年编码活动的一个总结,也许其中很多谬误,但至少在目前,它对我工作的帮助,起了很大作用。
现在整理发表出来,与大家互相切磋。如发现其中不合理的地方,恳请不留情面地指出来。
多线程下的设计模式研究(一):原子对象模式
[引言]
相信每一个在多线程环境下工作的程序员,都遇到过死锁、访问冲突等问题。这类问题来无影去无踪,难以重现、难以定位,是程序员中谈虎色变的一大bug。
使用原子对象模式,可以有效解决这个问题。
所谓原子对象模式,就是把需要在多线程环境下使用的数据,封装成一个对象,并在实现的时候保证所有公开的接口都是线程安全的。这样的一类对象,我们就可以称之为原子对象。
这种对象为调用者带来了很大的方便。任何一个线程都可以方便地使用这些对象,使用的时候不用考虑锁的问题。
[举例]
你有多个线程,需要访问一个用户列表。每个线程都有可能查找特定的用户,也有可能增加用户和删除用户。
下面是一个作为原子对象的用户列表的例子。为简单起见,该原子对象仅仅提供增加用户、查找某年龄段内的用户两种方法。
//用户结构体
struct User
{
int id; //用户ID
string name; //用户名
int age; //用户年龄
};
//用户列表类
所谓设计模式,不过是人们在编程活动中总结出来的一些常用的、有效的解决方法而已。自从我开始接触设计后,我就时常留意自己的常用的解决方案,希望能将这些解决方法抽象出来,形成模式。现在这一系列文章,是我这几年编码活动的一个总结,也许其中很多谬误,但至少在目前,它对我工作的帮助,起了很大作用。
现在整理发表出来,与大家互相切磋。如发现其中不合理的地方,恳请不留情面地指出来。
多线程下的设计模式研究(一):原子对象模式
[引言]
相信每一个在多线程环境下工作的程序员,都遇到过死锁、访问冲突等问题。这类问题来无影去无踪,难以重现、难以定位,是程序员中谈虎色变的一大bug。
使用原子对象模式,可以有效解决这个问题。
所谓原子对象模式,就是把需要在多线程环境下使用的数据,封装成一个对象,并在实现的时候保证所有公开的接口都是线程安全的。这样的一类对象,我们就可以称之为原子对象。
这种对象为调用者带来了很大的方便。任何一个线程都可以方便地使用这些对象,使用的时候不用考虑锁的问题。
[举例]
你有多个线程,需要访问一个用户列表。每个线程都有可能查找特定的用户,也有可能增加用户和删除用户。
下面是一个作为原子对象的用户列表的例子。为简单起见,该原子对象仅仅提供增加用户、查找某年龄段内的用户两种方法。
//用户结构体
struct User
{
int id; //用户ID
string name; //用户名
int age; //用户年龄
};
//用户列表类