單例模式的四種執行緒安全的實現

2021-10-04 23:39:23 字數 2866 閱讀 2940

1.懶漢經典模式,用互斥鎖實現

#include #include #include class csingletonlock

void lock()

void unlock()

};class csingleton

public:

static pthread_mutex_t m_mutex;

static csingleton* getinstance();

static csingleton* m_ptintance;

static csingletonlock *m_ptlock;

};pthread_mutex_t csingleton::m_mutex = pthread_mutex_initializer;

csingleton* csingleton::m_ptintance = null;

csingletonlock* csingleton::m_ptlock = new csingletonlock();

csingleton* csingleton::getinstance()

return m_ptintance;

}int g_getnum = 0;

pthread_mutex_t countmutex = pthread_mutex_initializer;

void* mythread(void * arg)

g_getnum++;

pthread_mutex_unlock(&countmutex);

}return (void *)0;

}int main()

; for (int i = 0; i < 20; i++)

for (int i = 0; i < 20; i++)

printf("%d\n", g_getnum);

return 0;

}

2.餓漢模式,直接在單例初始化時用new建立

#include #include #include class csingleton

public:

static csingleton* getinstance();

static csingleton* m_ptintance;

};csingleton* csingleton::m_ptintance = new csingleton();

csingleton* csingleton::getinstance()

return m_ptintance;

}int g_getnum = 0;

pthread_mutex_t countmutex = pthread_mutex_initializer;

void* mythread(void * arg)

g_getnum++;

pthread_mutex_unlock(&countmutex);

}return (void *)0;

}int main()

; for (int i = 0; i < 20; i++)

for (int i = 0; i < 20; i++)

printf("%d\n", g_getnum);

return 0;

}

3.類中定義靜態成員物件的實現

#include #include #include class csingleton

public:

static csingleton* getinstance();

static csingleton m_intance;

};csingleton csingleton::m_intance;

csingleton* csingleton::getinstance()

int g_getnum = 0;

pthread_mutex_t countmutex = pthread_mutex_initializer;

void* mythread(void * arg)

g_getnum++;

pthread_mutex_unlock(&countmutex);

}return (void *)0;

}int main()

; for (int i = 0; i < 20; i++)

for (int i = 0; i < 20; i++)

printf("%d\n", g_getnum);

return 0;

}

4.獲取單例函式中定義static靜態區域性變數的實現

#include #include #include class csingleton

public:

static csingleton* getinstance();

};csingleton* csingleton::getinstance()

int g_getnum = 0;

pthread_mutex_t countmutex = pthread_mutex_initializer;

void* mythread(void * arg)

g_getnum++;

pthread_mutex_unlock(&countmutex);

}return (void *)0;

}int main()

; for (int i = 0; i < 20; i++)

for (int i = 0; i < 20; i++)

printf("%d\n", g_getnum);

return 0;

}

實現執行緒安全的四種單例模式

列舉實現 推薦 確保乙個類只有乙個例項,並提供乙個全域性訪問點來訪問這個唯一的例項。單例模式有3個要點 根據這三個要點可知,類的建構函式私有化,並且在單例類中建立唯一的例項,最後提供靜態方法供外部共享訪問唯一的例項。餓漢式 public class eagersingleton public sta...

單例模式的四種實現方式

單例模式 多次例項化的結果指向同一例項 一,單例模式實現方式一 import settings class mysql instance none def init self,ip,sport self.ip ip self.port port classmethod def from conf c...

單例模式 四種

餓漢式 單例模式 餓漢式類載入到記憶體後,例項化乙個單例,jvm保證執行緒安全 都不能建立新的,所以安全,多執行緒都是安全的 簡單易用 缺點 不管是否用到,類載入時候就會例項化,浪費 一般專案開發中載入是用的class.forname 將class載入到記憶體,但不例項化,此時,如果使用餓漢,就會消...