聊聊鏈接池和線程

以前的博客中,有說到性能測試常見術語:鏈接池。其中大概簡述了鏈接池的做用等,這篇博客,就介紹下鏈接池以及鏈接池中線程對象的原理,做用以及優勢。。。html

 

1、鏈接池git

一、什麼是鏈接池?咱們爲何須要它?github

鏈接池容許多個客戶端使用緩存起來的鏈接對象,這些對象能夠鏈接數據庫,它們是共享的、可被重複使用的。算法

打開/關閉數據庫鏈接開銷很大,鏈接池技術容許咱們在鏈接池裏維護鏈接對象,這樣能夠提升數據庫的執行命令的性能。多個客戶端請求能夠重複使用相同的鏈接對象,當每次收到一個客戶端請求時,數據庫

就會搜索鏈接池,看看有沒有閒置鏈接對象。若是沒有,要麼全部的客戶端請求都進入隊列排隊,要麼在池中建立一個新的鏈接對象(這取決於池裏已有多少個鏈接存在以及配置支持多少鏈接)。緩存

一旦某個請求使用完鏈接對象以後,這個對象會被從新放入池中,而後會被從新分派給排隊等待的請求(分派給哪一個請求要看使用什麼調度算法)。服務器

由於大部分請求都是使用現存的鏈接對象,因此鏈接池技術大大減小了等待建立數據庫鏈接的時間,從而減小了平均鏈接時間。網絡

二、如何使用鏈接池?多線程

鏈接池在基於網絡的企業級應用中很常見,應用服務器負責建立鏈接對象、添加它們到鏈接池中,分派鏈接對象給請求,回收使用完畢的鏈接對象,從新將它們放回鏈接池去。函數

當網絡應用建立數據庫鏈接時,應用服務器會從池中取出鏈接對象,而當它使用完畢以後關閉時,應用服務器又負責將使用完的鏈接對象放回池中。

PS:也可使用JDBC 1.0/JDBC 2.0 API來獲取物理鏈接(physical connnection),但這種狀況很是少見,由於數據庫只須要鏈接一次,不須要鏈接池的狀況。

三、鏈接池能夠處理多少鏈接?誰建立/釋放鏈接?

能夠進行配置最大的鏈接數、最小鏈接數、最大空閒鏈接數等,全部這些參數均可以由服務器管理員配置。服務器啓動時,固定數量的鏈接對象(配置的最小鏈接數)被建立,並添加到鏈接池中。

當客戶端請求消耗完全部的鏈接對象時,再有新的請求都會建立新的鏈接對象,它們被添加到鏈接池再分派給這個新的請求,直到設置的達到最大的鏈接數。

服務器也會一直查看閒置的鏈接對象數,當檢測到閒置的鏈接數超過設置值時,服務器會關閉閒置鏈接,而後它們將被垃圾回收。

四、傳統的鏈接池 vs 可管理的鏈接池

鏈接池是個開放的概念,任何應用均可以使用這個概念,並用本身想要的方式管理它。鏈接池概念指的是建立、管理、維護鏈接對象。

但當應用的規模增大時,若是沒有一個健壯的鏈接池機制的話,管理鏈接是會得愈來愈困難。

所以,創建一個健壯的、可管理的鏈接池頗有必要。

PS:關於鏈接池的內容,參考自http://www.importnew.com/8179.html

 

2、線程&線程池,鏈接&鏈接池

線程:程序執行流的最小單元,進程中的一個實體,一個相對獨立的、可調度的執行單元,是被系統獨立調度和分派的基本單位;

多線程技術,指在一個進程當中能夠建立多個線程來「同時」處理多個事務;

線程池:能夠理解爲緩衝區,因爲頻繁的建立銷燬線程會帶來必定的成本,能夠預先建立,但不當即銷燬,以共享方式爲別人提供服務,一來能夠提供效率,再者能夠控制線程無線擴張。

鏈接:指一點與另外一點的鏈接;

鏈接池:跟線程池有一樣的妙處,鏈接池能夠是基於多線程來實現,也能夠經過多進程來實現,也多是單實例的。

舉個例子:

Socket在作爲服務時,能夠同時監聽多個客戶端鏈接,那麼它的實現原理就有點像「鏈接池」;每一個客戶經過多個端口同時向服務器發送數據,能夠認爲是多線程,

而服務器可能已經創建好了n個線程來等待同時處理/分析客戶端發來的數據,能夠爲是有個「線程池」。

 

3、線程的幾種狀態

線程在必定條件下,狀態會發生變化。線程一共有如下幾種狀態:

一、新建狀態(New):新建立了一個線程對象。

二、就緒狀態(Runnable):線程對象建立後,其餘線程調用了該對象的start()方法。該狀態的線程位於「可運行線程池」中,變得可運行,只等待獲取CPU的使用權,

   即在就緒狀態的進程除CPU以外,其它的運行所需資源都已所有得到。

三、運行狀態(Running):就緒狀態的線程獲取了CPU,執行程序代碼。

四、阻塞狀態(Blocked):阻塞狀態是線程由於某種緣由放棄CPU使用權,暫時中止運行。直到線程進入就緒狀態,纔有機會轉到運行狀態。

   阻塞的狀況分三種:

①.等待阻塞:運行的線程執行wait()方法,該線程會釋放佔用的全部資源,JVM會把該線程放入「等待池」中。進入這個狀態後,是不能自動喚醒的,

   必須依靠其餘線程調用notify()或notifyAll()方法才能被喚醒,

②.同步阻塞:運行的線程在獲取對象的同步鎖時,若該同步鎖被別的線程佔用,則JVM會把該線程放入「鎖池」中。

③.其餘阻塞:運行的線程執行sleep()或join()方法,或者發出了I/O請求時,JVM會把該線程置爲阻塞狀態。當sleep()狀態超時、join()等待線程終止或者超時,

   或者I/O處理完畢時,線程從新轉入就緒狀態。

五、死亡狀態(Dead):線程執行完了或者因異常退出了run()方法,該線程結束生命週期。

   線程變化的狀態轉換圖以下:

PS:拿到對象的鎖標記,即爲得到了對該對象(臨界區)的使用權限。即該線程得到了運行所需的資源,進入「就緒狀態」,只需得到CPU,就能夠運行。

    由於當調用wait()後,線程會釋放掉它所佔有的「鎖標誌」,因此線程只有在此獲取資源才能進入就緒狀態。

下面做下解釋: 

①.線程的實現有兩種方式,一是繼承Thread類,二是實現Runnable接口,但無論怎樣,  當咱們new了這個對象後,線程就進入了初始狀態; 

②.當該對象調用了start()方法,就進入就緒狀態; 

③.進入就緒後,當該對象被操做系統選中,得到CPU時間片就會進入運行狀態; 

④.進入運行狀態後狀況就比較複雜;

   (1)run()方法或main()方法結束後,線程就進入終止狀態; 

   (2)當線程調用了自身的sleep()方法或其餘線程的join()方法,進程讓出CPU,而後就會進入阻塞狀態(該狀態既中止當前線程,但並不釋放所佔有的資源,

       即調用sleep()函數後,線程不會釋放它的「鎖標誌」。)。當sleep()結束或join()結束後,該線程進入可運行狀態,繼續等待OS分配CPU時間片;

       典型地,sleep()被用在等待某個資源就緒的情形;測試發現條件不知足後,讓線程阻塞一段時間後從新測試,直到條件知足爲止。

   (3)線程調用了yield()方法,意思是放棄當前得到的CPU時間片,回到就緒狀態,這時與其餘進程處於同等競爭狀態,OS有可能會接着又讓這個進程進入運行狀態;

       調用 yield() 的效果等價於調度程序認爲該線程已執行了足夠的時間片從而須要轉到另外一個線程。yield()只是使當前線程從新回到可執行狀態,

       因此執行yield()的線程有可能在進入到可執行狀態後立刻又被執行。

   (4)當線程剛進入可運行狀態(注意,還沒運行),發現將要調用的資源被synchroniza(同步),獲取不到鎖標記,將會當即進入鎖池狀態,等待獲取鎖標記

      (這時的鎖池裏也許已經有了其餘線程在等待獲取鎖標記,這時它們處於隊列狀態,既先到先得),一旦線程得到鎖標記後,就轉入就緒狀態,等待OS分配CPU時間片。

   (5)suspend() 和 resume()方法:兩個方法配套使用,suspend()使得線程進入阻塞狀態,而且不會自動恢復,必須其對應的resume()被調用,才能使得線程從新進入可執行狀態。

       典型地,suspend()和 resume() 被用在等待另外一個線程產生的結果的情形:測試發現結果尚未產生後,讓線程阻塞,另外一個線程產生告終果後,調用resume()使其恢復。 

   (6)wait()和 notify() 方法:當線程調用wait()方法後會進入等待隊列(進入這個狀態會釋放所佔有的全部資源,與阻塞狀態不一樣),進入這個狀態後,是不能自動喚醒的,

       必須依靠其餘線程調用notify()或notifyAll()方法才能被喚醒(因爲notify()只是喚醒一個線程,但咱們由不能肯定具體喚醒的是哪個線程,也許咱們須要喚醒的線程不可以被喚醒,

       所以在實際使用時,通常都用notifyAll()方法,喚醒有所線程),線程被喚醒後會進入鎖池,等待獲取鎖標記。 

       wait() 使得線程進入阻塞狀態,它有兩種形式:

       一種容許指定以ms爲單位的時間做爲參數,另外一種沒有參數。前者當對應的notify()被調用或超出指定時間時線程從新進入可執行狀態即就緒狀態,後者則必須對應的notify()被調用。

       當調用wait()後,線程會釋放掉它所佔有的「鎖標誌」,從而使線程所在對象中的其它synchronized數據可被別的線程使用。

       waite()和notify()由於會對對象的「鎖標誌」進行操做,因此它們必須在synchronized函數或synchronizedblock中進行調用。

       若是在non-synchronized函數或non-synchronizedblock中進行調用,雖然能編譯經過,但在運行時會發生IllegalMonitorStateException的異常。

PS:關於線程的幾種狀態,轉載自開源中國:線程的幾種狀態

相關文章
相關標籤/搜索