本文介紹3種執行緒安全模式
1,lock
2,mutex
3,methodimpl
以前寫的乙個mysql資料庫連線池connectionpool.cs
usingsystem;
using
system.collections.generic;
using
system.linq;
using
system.text;
using
system.io;
using
system.threading;
using
mysql.data.mysqlclient;
using
system.runtime.compilerservices;
namespace
queue.service.basic
}[methodimpl(methodimploptions.synchronized)]
public
static
connectionpool getinstance()
return
connpool;
}public
mysqlconnection getconnection()
else
catch
(exception e)}}
conn =(mysqlconnection)pool.pop();
}return
conn;
}private
string
getconnstring()
return
connstring;
}public
void
releaseconnection(mysqlconnection conn)
}private
mysqlconnection createconnection()}}
}
總結:1,上面類中使用了 主要使用了 lock 方式。
lock()是對乙個物件加互斥鎖,只允許乙個執行緒訪問其後大括號中語句塊,直到該語句塊的**執行完才解鎖,解鎖後才允許其他的執行緒執行其語句塊。
2,單例模式使用了懶漢模式。
餓漢式是在類裝載的時候直接得到該類的例項,可以說是前期繫結的;懶漢式是後期繫結的,類載入的時候connpool是空的,在需要的時候才被建立且僅建立一次。餓漢式的速度快,效率高,但是耗費系統資源;懶漢式則相反。懶漢式還存在乙個問題,就是後期繫結不能確保物件只能被例項化一次,這需要對指示類是否例項化的標誌設定1個互斥鎖,僅允許1個執行緒訪問。這樣就可以確保物件只被例項化一次。
3,單例模式的執行緒安全使用了 methodimpl。
他指定了getinstance()方法同時只能被乙個執行緒使用。
4,使用mutex類進行同步
修改**為:
privatestatic mutex mutex = new
mutex();
public
static
connectionpool getinstance()
mutex.releasemutex();
return
connpool;
}
執行緒池 資料庫連線池
執行緒池的原理 來看一下執行緒池究竟是怎麼一回事?其實執行緒池的原理很簡單,類似於作業系統中的緩衝區的概念,它的流程如下 先啟動若干數量的執行緒,並讓這些執行緒都處於睡 眠狀態,當客戶端有乙個新請求時,就會喚醒執行緒池中的某乙個睡眠執行緒,讓它來處理客戶端的這個請求,當處理完這個請求後,執行緒又處於...
執行緒池 資料庫連線池
執行緒池原理 先啟動若干數量的執行緒,並讓這些執行緒都處於睡眠狀態,當客戶端有乙個新請求時,就會喚醒執行緒池中的某乙個睡眠執行緒,讓它來處理客戶端的這個請求,當處理完這個請求後,執行緒又處於睡眠狀態。資料庫連線池原理 資料庫連線池的解決方案是在應用程式啟動時建立足夠的資料庫連線,並講這些連線組成乙個...
執行緒池 和資料庫連線池
執行緒池的原理 來看一下執行緒池究竟是怎麼一回事?其實執行緒池的原理很簡單,類似於作業系統中的緩衝區的概念,它的流程如下 先啟動若干數量的執行緒,並讓這些執行緒都處於睡眠狀態,當客戶端有乙個新請求時,就會喚醒執行緒池中的某乙個睡眠執行緒,讓它來處理客戶端的這個請求,當處理完這個請求後,執行緒又處於睡...