環境資訊中心綜合外電;黃鈺婷、鄒敏惠 編譯;趙家緯 審校
本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※超省錢租車方案
※別再煩惱如何寫文案,掌握八大原則!
※回頭車貨運收費標準
※教你寫出一流的銷售文案?
※產品缺大量曝光嗎?你需要的是一流包裝設計!
※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益
※網頁設計最專業,超強功能平台可客製化
摘錄自2020年4月7日自由時報台南報導
台南原訂於4月1日起,「有店面」的餐飲業應提供環保餐具給現場食用的消費者「選擇」使用的環保新措施,隨著武漢肺炎疫情逐漸升溫,環保局決議將暫緩實施,鼓勵民眾自備餐具做好餐飲衛生管理。
台南市長黃偉哲說,南市以在地小吃聞名,為減少一次性產品廢棄量,才依法進行此次提供環保餐具的環保新措施。但近來武漢肺炎疫情全台發酵,業者也反應消費者在使用上存有疑慮,故經審慎考量後先暫緩實施本項環保新措施,待疫情緩和後,再重新檢討制定合宜的實施日期。
【其他文章推薦】
※廢氣洗滌塔,叫得動, 找得到的專業廠商
※市面十大品牌封口機!該如何選購?
※塑膠射出成型加工商品有哪些?
※貨梯使用安全與保養
※掌握產品行銷策略,帶你認識商品包裝設計基本要素
※臭氧機推薦
在面試的時候面試官會怎麼在單例模式中提問呢?你又該如何回答呢?可能你在面試的時候你會碰到這些問題:
為什麼說餓漢式單例天生就是線程安全的?
傳統的懶漢式單例為什麼是非線程安全的?
怎麼修改傳統的懶漢式單例,使其線程變得安全?
線程安全的單例的實現還有哪些,怎麼實現?
雙重檢查模式、Volatile關鍵字 在單例模式中的應用
ThreadLocal 在單例模式中的應用
枚舉式單例
那我們該怎麼回答呢?那答案來了,看完接下來的內容就可以跟面試官嘮嘮單例模式了
單例模式是一種常用的軟件設計模式,其屬於創建型模式,其含義即是一個類只有一個實例,併為整個系統提供一個全局訪問點 (向整個系統提供這個實)。
結構:
單例模式三要素:
私有的構造方法;
私有靜態實例引用;
返回靜態實例的靜態公有方法。
在內存中只有一個對象,節省內存空間;
避免頻繁的創建銷毀對象,可以提高性能;
避免對共享資源的多重佔用,簡化訪問;
為整個系統提供一個全局訪問點。
在使用單例模式時,我們必須使用單例類提供的公有工廠方法得到單例對象,而不應該使用反射來創建,使用反射將會破壞單例模式 ,將會實例化一個新對象。
在單線程環境下,單例模式根據實例化對象時機的不同分為,
餓漢式單例(立即加載),餓漢式單例在單例類被加載時候,就實例化一個對象並將引用所指向的這個實例;
懶漢式單例(延遲加載),只有在需要使用的時候才會實例化一個對象將引用所指向的這個實例。
從速度和反應時間角度來講,餓漢式(又稱立即加載)要好一些;從資源利用效率上說,懶漢式(又稱延遲加載)要好一些。
// 餓漢式單例 public class HungrySingleton{ // 私有靜態實例引用,創建私有靜態實例,並將引用所指向的實例 private static HungrySingleton singleton = new HungrySingleton(); // 私有的構造方法 private HungrySingleton(){} //返回靜態實例的靜態公有方法,靜態工廠方法 public static HungrySingleton getSingleton(){ return singleton; } }
餓漢式單例,在類被加載時,就會實例化一個對象並將引用所指向的這個實例;更重要的是,由於這個類在整個生命周期中只會被加載一次,只會被創建一次,因此惡漢式單例是線程安全的。
因為類加載的方式是按需加載,且只加載一次。由於一個類在整個生命周期中只會被加載一次,在線程訪問單例對象之前就已經創建好了,且僅此一個實例。即線程每次都只能也必定只可以拿到這個唯一的對象。
// 懶漢式單例 public class LazySingleton { // 私有靜態實例引用 private static LazySingleton singleton; // 私有的構造方法 private LazySingleton(){} // 返回靜態實例的靜態公有方法,靜態工廠方法 public static LazySingleton getSingleton(){ //當需要創建類的時候創建單例類,並將引用所指向的實例 if (singleton == null) { singleton = new LazySingleton(); } return singleton; } }
懶漢式單例是延遲加載,只有在需要使用的時候才會實例化一個對象,並將引用所指向的這個對象。
由於是需要時創建,在多線程環境是不安全的,可能會併發創建實例,出現多實例的情況,單例模式的初衷是相背離的。那我們需要怎麼避免呢?可以看接下來的多線程中單例模式的實現形式。
非線程安全主要原因是,會有多個線程同時進入創建實例(if (singleton == null) {}代碼塊)的情況發生。當這種這種情形發生后,該單例類就會創建出多個實例,違背單例模式的初衷。因此,傳統的懶漢式單例是非線程安全的。
在單線程環境下,無論是餓漢式單例還是懶漢式單例,它們都能夠正常工作。但是,在多線程環境下就有可能發生變異:
餓漢式單例天生就是線程安全的,可以直接用於多線程而不會出現問題
懶漢式單例本身是非線程安全的,因此就會出現多個實例的情況,與單例模式的初衷是相背離的。
那我們應該怎麼在懶漢的基礎上改造呢?
synchronized方法
synchronized塊
使用內部類實現延遲加載
// 線程安全的懶漢式單例 public class SynchronizedSingleton { private static SynchronizedSingleton synchronizedSingleton; private SynchronizedSingleton(){} // 使用 synchronized 修飾,臨界資源的同步互斥訪問 public static synchronized SynchronizedSingleton getSingleton(){ if (synchronizedSingleton == null) { synchronizedSingleton = new SynchronizedSingleton(); } return synchronizedSingleton; } }
使用 synchronized 修飾 getSingleton()方法,將getSingleton()方法進行加鎖,實現對臨界資源的同步互斥訪問,以此來保證單例。
雖然可現實線程安全,但由於同步的作用域偏大、鎖的粒度有點粗,會導致運行效率會很低。
// 線程安全的懶漢式單例 public class BlockSingleton { private static BlockSingleton singleton; private BlockSingleton(){} public static BlockSingleton getSingleton2(){ synchronized(BlockSingleton.class){ // 使用 synchronized 塊,臨界資源的同步互斥訪問 if (singleton == null) { singleton = new BlockSingleton(); } } return singleton; } }
其實synchronized塊跟synchronized方法類似,效率都偏低。
// 線程安全的懶漢式單例 public class InsideSingleton { // 私有內部類,按需加載,用時加載,也就是延遲加載 private static class Holder { private static InsideSingleton insideSingleton = new InsideSingleton(); } private InsideSingleton() { } public static InsideSingleton getSingleton() { return Holder.insideSingleton; } }
如上述代碼所示,我們可以使用內部類實現線程安全的懶漢式單例,這種方式也是一種效率比較高的做法。其跟餓漢式單例原理是相同的, 但可能還存在反射攻擊或者反序列化攻擊 。
使用雙重檢測同步延遲加載去創建單例,不但保證了單例,而且提高了程序運行效率。
// 線程安全的懶漢式單例 public class DoubleCheckSingleton { //使用volatile關鍵字防止重排序,因為 new Instance()是一個非原子操作,可能創建一個不完整的實例 private static volatile DoubleCheckSingleton singleton; private DoubleCheckSingleton() { } public static DoubleCheckSingleton getSingleton() { // Double-Check idiom if (singleton == null) { synchronized (DoubleCheckSingleton.class) { // 只需在第一次創建實例時才同步 if (singleton == null) { singleton = new DoubleCheckSingleton(); } } } return singleton; } }
為了在保證單例的前提下提高運行效率,我們需要對singleton實例進行第二次檢查,為的式避開過多的同步(因為同步只需在第一次創建實例時才同步,一旦創建成功,以後獲取實例時就不需要同步獲取鎖了)。
但需要注意的必須使用volatile關鍵字修飾單例引用,為什麼呢?
如果沒有使用volatile關鍵字是可能會導致指令重排序情況出現,在Singleton 構造函數體執行之前,變量 singleton可能提前成為非 null 的,即賦值語句在對象實例化之前調用,此時別的線程將得到的是一個不完整(未初始化)的對象,會導致系統崩潰。
此可能為程序執行步驟:
線程 1 進入 getSingleton() 方法,由於 singleton 為 null,線程 1 進入 synchronized 塊 ;
同樣由於 singleton為 null,線程 1 直接前進到 singleton = new DoubleCheckSingleton()處,在new對象的時候出現重排序,導致在構造函數執行之前,使實例成為非 null,並且該實例並未初始化的(原因在NOTE);
此時,線程 2 檢查實例是否為 null。由於實例不為 null,線程 2 得到一個不完整(未初始化)的 Singleton 對象;
線程 1 通過運行 Singleton對象的構造函數來完成對該對象的初始化。
這種安全隱患正是由於指令重排序的問題所導致的。而volatile 關鍵字正好可以完美解決了這個問題。使用volatile關鍵字修飾單例引用就可以避免上述災難。
NOTE
new 操作會進行三步走,預想中的執行步驟:
memory = allocate(); //1:分配對象的內存空間
ctorInstance(memory); //2:初始化對象
singleton = memory; //3:使singleton3指向剛分配的內存地址**但實際上,這個過程可能發生無序寫入(指令重排序),可能會導致所下執行步驟:
memory = allocate(); //1:分配對象的內存空間
singleton3 = memory; //3:使singleton3指向剛分配的內存地址
ctorInstance(memory); //2:初始化對象
藉助於 ThreadLocal,我們可以實現雙重檢查模式的變體。我們將臨界資源線程局部化,具體到本例就是將雙重檢測的第一層檢測條件 if (instance == null) 轉換為 線程局部範圍內的操作 。
// 線程安全的懶漢式單例 public class ThreadLocalSingleton // ThreadLocal 線程局部變量 private static ThreadLocal<ThreadLocalSingleton> threadLocal = new ThreadLocal<ThreadLocalSingleton>(); private static ThreadLocalSingleton singleton = null; private ThreadLocalSingleton(){} public static ThreadLocalSingleton getSingleton(){ if (threadLocal.get() == null) { // 第一次檢查:該線程是否第一次訪問 createSingleton(); } return singleton; } public static void createSingleton(){ synchronized (ThreadLocalSingleton.class) { if (singleton == null) { // 第二次檢查:該單例是否被創建 singleton = new ThreadLocalSingleton(); // 只執行一次 } } threadLocal.set(singleton); // 將單例放入當前線程的局部變量中 } }
藉助於 ThreadLocal,我們也可以實現線程安全的懶漢式單例。但與直接雙重檢查模式使用,使用ThreadLocal的實現在效率上還不如雙重檢查鎖定。
它不僅能避免多線程同步問題,而且還能防止反序列化重新創建新的對象,
直接通過Singleton.INSTANCE.whateverMethod()的方式調用即可。方便、簡潔又安全。
public enum EnumSingleton { instance; public void whateverMethod(){ //dosomething } }
使用多個線程,並使用hashCode值計算每個實例的值,值相同為同一實例,否則為不同實例。
public class Test { public static void main(String[] args) { Thread[] threads = new Thread[10]; for (int i = 0; i < threads.length; i++) { threads[i] = new TestThread(); } for (int i = 0; i < threads.length; i++) { threads[i].start(); } } } class TestThread extends Thread { @Override public void run() { // 對於不同單例模式的實現,只需更改相應的單例類名及其公有靜態工廠方法名即可 int hash = Singleton5.getSingleton5().hashCode(); System.out.println(hash); } }
單例模式是 Java 中最簡單,也是最基礎,最常用的設計模式之一。在運行期間,保證某個類只創建一個實例,保證一個類僅有一個實例,並提供一個訪問它的全局訪問點 ,介紹單例模式的各種寫法:
餓漢式單例(線程安全)
懶漢式單例
傳統懶漢式單例(線程安全);
使用synchronized方法實(線程安全);
使用synchronized塊實現懶漢式單例(線程安全);
使用靜態內部類實現懶漢式單例(線程安全)。
使用雙重檢查模式
使用volatile關鍵字(線程安全);
使用ThreadLocal實現懶漢式單例(線程安全)。
枚舉式單例
各位看官還可以嗎?喜歡的話,動動手指點個,點個關注唄!!謝謝支持! 歡迎關注公眾號【Ccww技術博客】,原創技術文章第一時間推出
本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面
※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!
※想知道最厲害的網頁設計公司"嚨底家"!
※別再煩惱如何寫文案,掌握八大原則!
※產品缺大量曝光嗎?你需要的是一流包裝設計!
※回頭車貨運收費標準
※台中搬家公司費用怎麼算?
根據美國農業部公告,H7N3目前「沒有任何人類感染案例」,因此沒有立即性的健康疑慮,但是為了以防萬一,建議在烹調家禽與雞蛋時應以165˚F(約74℃)溫度殺死病毒與細菌。
根據世界動物衛生組織(OIE)規範,如果「4-8週齡的雞感染後死亡率達75%」即「高病原性禽流感」,通常出現在H5、H7型上。人類如果感染禽流感,可能出現高燒、呼吸急促等症狀,由甲型禽流感(如H5N1、H5N6、H7N9和H10N8病毒)引起的症狀比一般流感嚴重,大多數患者須住院治療。
【其他文章推薦】
※無塵擦拭布各大品牌廠商販售比價網!
※如何正確使用飲水機?
※掌握產品行銷策略,帶你認識商品包裝設計基本要素
※精密CNC 自動車床設備介紹
※空壓機這裡買最划算!
摘錄自2020年10月19日聯合報報導
彰化、南投各鄉鎮的大型家具收費不一,彰化縣府近日訂出收費統一標準,8月已公告並行文給公所,但多數仍未執行。有民眾為規避收費將廢家具運到隔壁鄉鎮丟棄;南投也曾試圖統一收費標準,但地方意見不一暫緩實施。台中全市都沒收費,住戶自來水單有徵收清除處理費就提供服務。
多數鄉鎮將大型家戶廢棄物清運視為「為民服務」,有清潔隊私下說,民眾若認為收費太高可能將廢棄物亂丟,反而造成環境髒亂。
彰化縣環保局長江培根說,過去未訂收費標準曾遭審計室檢討,才擬定全縣統一標準,清潔隊出勤代清除就須依訂定金額收費,但也考量有家戶無力繳納,公所有權限決定是否免收。
南投縣環保局則表示,過去針對家具等大型廢棄物統一收費標準,地方意見不一才暫緩實施,廢棄物相關清運權也委由各公所處置;現階段無統一標準,費用也得向各清潔隊洽詢,但大多未收費。
【其他文章推薦】
※飲水機皆有含淨水功能嗎?
※貨梯使用安全與保養
※十大封口機人氣排行榜-烘焙必備幫手!
※高價位跟低價位的示波器又有何差異?
※POGOPIN基本常識有哪些?
※空壓機這裡買最划算!
摘錄自2020年3月31日聯合報報導
聯合國糧農組織(FAO)日前稱,受全球疫情影響,全球糧食供應鏈將於4月至5月中斷。而俄國、越南等國家為保證糧食供給,已宣布停止出口。A股農業族群今(31)日走強,金健米業再度飆漲停,京糧控股大漲8%,傲農生物、農發種業、萬向德農紛紛拉升。
金融網報導,其中,柬埔寨首相宣布受新冠肺炎疫情影響,將自4月5日起禁止部分大米出口。埃及自3月28日起未來3個月內停止各種豆類產品的出口;哈薩克斯坦禁止出口小麥麵粉、紅蘿蔔、糖和馬鈴薯;越南暫停簽署新的大米出口合約;俄國將每周評估情況,再決定是否實施出口禁令。
聯合國糧農組織(FAO)日前稱,受全球疫情影響,全球糧食供應鏈將於4月至5月中斷。而俄國、越南等國家為保證糧食供給,已宣布停止出口。
【其他文章推薦】
※石墨與鑽石區別在哪?
※專業客製化禮物、贈品設計,辦公用品常見【L夾】搖身一變大受好評!!
※高價位跟低價位的示波器又有何差異?
※無塵擦拭布各大品牌廠商販售比價網!
※想知道CNC 自動車床與CNC車床有何區別??
※特殊螺絲工廠批發-精密零件專售
※餐飲器具首選, 多種功能側火烤爐設備,小本經營最佳生財器具
摘錄自2020年6月11日自由時報報導
被諷刺為「最毒海岸線」的新豐西側海岸非法棄置物,新竹縣政府斥資7000多萬元,終於在今年3月清除完畢,後續再爭取到經濟部水利署補助總經費1億1756萬元,將辦理加強海岸防護工程,工期270日曆天,如招標作業順利,預計明年4月可竣工。
縣長楊文科表示,由於新豐海岸漂沙方向由北往南,長期缺乏海岸輸沙補助,再加上突出海岸地形,易形成波浪能量集中現象,加速侵蝕海岸沙灘與灘崖崩落災害,為完善海岸環境問題,該工程可以提高海岸防護,並採用天然材料以柔性工法,降低工程措施對海岸生態環境之影響,達到海岸侵蝕防治、防止國土流失的目標。
工務處表示,該計畫針對新豐垃圾掩埋場西側的海岸段抑制波浪溯上、堤趾沖刷加劇灘崖崩塌等問題,主要有3個防護工程作業,施作「拋石護岸」長度520公尺,降低海岸侵蝕災害,減輕波浪衝擊崖腳堤趾負擔;「疏濬養灘工作」預定由頭前溪口沙洲供應,約10萬立方公尺養灘土砂;佈設「潛沒式離岸突堤」4座,配合於其海側進行人工養灘作業,加強沙灘穩固與減緩養灘粒料流失。
【其他文章推薦】
※空壓機這裡買最划算!
※貨梯使用安全與保養
※臭氧機推薦
※高效率洗滌塔活性碳設備有哪些?
摘錄自2020年4月13日中央社報導
全球最大豬肉加工商史密斯菲爾德食品公司(Smithfield Foods)今(12日)指出,因為有數百員工感染武漢肺炎,將無限期關閉美國的一家豬肉工廠。這家公司也警告,疫情大流行期間可能出現肉類供應短缺。
美國南達科他州州長諾埃姆(Kristi Noem)昨天表示,設在南達科他州蘇瀑市(Sioux Falls)的史密斯菲爾德食品公司豬肉工廠,有238名員工感染2019冠狀病毒疾病(COVID-19,武漢肺炎),占全州確診總數的55%。
諾埃姆與蘇瀑市(Sioux Falls)市長譚哈肯(Paul TenHaken)建議,史密斯菲爾德食品公司應關閉發生疫情的工廠至少兩週。這座工廠約有3700員工,是全美最大豬肉加工廠之一,占美國豬肉產量的4%至5%。
生活環境
國際新聞
豬肉
加工
疫情下的食衣住行
武漢肺炎
食品安全
本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益
※別再煩惱如何寫文案,掌握八大原則!
※教你寫出一流的銷售文案?
※超省錢租車方案
※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益
※產品缺大量曝光嗎?你需要的是一流包裝設計!
※回頭車貨運收費標準