多线程在服务器端编程过程中应用很广。在应用设计模式时需要注意线程安全问题。
线程安全我认为就是编程过程中线程数据共享和数据同步需要考虑的。多个线程共用一个变量,指针,对象;需要保证数据同步过程中不出现混乱,保证运算的正确性。
设计模式之结构型模式关注如何组合类和对象以形成更大的实体,其实也就是对象的数据结构和组织方式。如果对象为多个线程服务,需要保证对象的线程安全。
装饰器模式不靠继承来扩展行为。对象以接口的方式传递给装饰工人,如果传递给多个装饰工人,就涉及到线程安全问题。装饰工人在装饰工程中需要注意线程安全,要确保装饰工人按顺序进行装饰,而不能多个装饰工人同时进行装饰操作。
设计模式中最需要注意线程安全的单例模式,单例模式顾名思义,就是整个程序运行中只是一个对象。在多线程中队单例的创建问题就涉及到线程安全。另外如果单例是一个组合对象(组合模式),对组合的添加,删除,查找也涉及到线程安全。
举例说明:比较常用的数据库连接池就是应用了单例模式和组合模式。首先保证线程池只能有一个,另外在对数据库连接池获取过程中只能把一个数据库连接付给一个应用体,避免一个数据库连接付给多个应用体。
下例简单的实现了数据库连接池:
class dbpool<T>
{
Queue<T> dbqueue ;
private object lockobj;
private dbpool()
{
dbqueue = new Queue<T>();
lockobj = new object();
}
/// <summary>
/// 用于懒惰式初始化嵌套类
/// </summary>
class SingletonCreateor
{
internal static readonly dbpool<T> dbp = new dbpool<T>();
}
/// <summary>
/// 获取单例对象
/// </summary>
/// <returns></returns>
public static dbpool<T> getSingletonInstance()
{
return SingletonCreateor.dbp;
}
/// <summary>
/// 添加数据库连接池对象
/// </summary>
/// <param name="t"></param>
public void add(T t)
{
dbqueue.Enqueue(t);
}
/// <summary>
/// 获取数据库连接
/// </summary>
/// <returns></returns>
public T get()
{
lock (lockobj) //保证数据库连接获取过程中的正确性,保证Dequeue不出现异常
{
if (dbqueue.Count > 0)
return dbqueue.Dequeue();
}
}
/// <summary>
/// 释放数据库连接
/// </summary>
/// <param name="t"></param>
public void release(T t)
{
dbqueue.Enqueue(t);
}
}
这个数据库连接池再配合适配器模式,可以很好的实现程序应用中对多源数据库连接池的应用。