1. 程式人生 > 實用技巧 >pandas+sqlAlchemy操作資料庫

pandas+sqlAlchemy操作資料庫

在這裡插入圖片描述
餓漢式一般用這兩種,一種靜態常量一種靜態程式碼塊
優點:執行緒安全
缺點:類似於立即載入沒有延遲載入,所以會造成記憶體資源的浪費,因為這兩種方案都是通過類載入的時候進行建立物件的,而類載入的方法有很多種

這裡插一點題外話,類載入有哪幾種,一種就是我們熟悉的靜態方法或者靜態域被呼叫,還有就是物件的建立,也就是物件的例項化,類會被載入,還有一種就是java程式設計思想中提到的繼承,繼承的話類載入器會先載入其.class檔案,然後如果發現基類,還會去載入其基類,也就是其父類也會被載入,比如下圖
在這裡插入圖片描述
我們在main方法中只用了man m=new man(),說明了其類載入的順序,如果繼承的話,先載入父類,因為我們父類的構造方法和靜態程式碼塊被呼叫了,其實構造方法預設就是static的,所以也會被載入

這裡還可以複習一下final關鍵字:final關鍵字如果修飾變數的話可以賦初值,但是以後就不能賦值了,如果修飾物件的引用的話,這個引用是不能夠改變的,物件卻是可以變的,如果修飾傳入的引數的話,也是不可變的,如果是修飾方法的話,是不能被繼承的等等,final static 修飾的就是一段固定不變的儲存空間

懶漢式:
第一種,同步方法的方式實現
在這裡插入圖片描述
優點:執行緒安全
缺點:效率太低了,為什麼低就是因為如果我們已經建立好了物件,我們就不需要每次都被判斷是否等於null了直接返回就好了

第二種方法:雙重檢查的方法,通過兩個判斷是否為空來解決
在這裡插入圖片描述
這裡涉及到volatile關鍵字和synchronized的關鍵字,volatile就相當於可見,按照我自己目前的理解,就是執行緒的話,有一個主記憶體,還有一個工作記憶體,那麼如果我們其中一個執行緒要進行修改值的話,它可能會在一個副本里面寫,不會立即寫回到主記憶體裡面,那麼我們加上這個關鍵字volatile的話,就相當於可見了,保證了其原子性,就是相當於每次修改值立即寫到主記憶體當中.

synchronized就是鎖機制,物件就是鎖,鎖即是物件,所以我們可以利用其他物件進行鎖,也可以通過自己this這個鎖,但是要注意的是static方法的時候,我們不可能用物件鎖,因為static的呼叫不需要物件,所以我們就用其類.class進行上鎖處理,在jdk1.7以後該鎖被優化了很多,所以這個推薦使用
回到這種設計模式,其實通過兩層判斷是否為空來進行操作,在裡面鎖的話大大提高了效率,推薦使用,因為如果有兩個執行緒都執行進去的話,那麼通過volatile關鍵字可見性,一個執行緒進行建立,另一個執行緒就知道了該物件已經被建立好了,那麼就不需要接下來的判斷了,直接返回物件,一方面這種方法保證了執行緒安全,也起到了延遲載入,所以推薦使用
第三種方法,靜態內部類的方式進行實現
在這裡插入圖片描述
因為靜態內部類載入只在我們getsingleton5這個方法進行呼叫的時候才會進行初始化,所以也起到了延遲載入的效果,同時保證了執行緒的安全問題
第四種方法:列舉方法,這個方法也是一些大佬推薦使用的方法,
在這裡插入圖片描述
通過列舉實現單例

總結,一般情況下,單例保證了該類只存在一個物件,節約了資源,一般用於頻繁使用獲取的地方,比如我們用的工具類可以用單例模式進行設計,還有就是資料來源呀,session工廠這種建立物件耗費時間資源比較多的物件,這樣設計會有很大的好處