單例模式的好處:
簡單的單例:
public class singleton
public static singleton getinstance()
}
上面**需要注意幾點:
缺點:singleton例項在何時建立不受控制,instance物件會在第一次初始化時被建立
比如,在singleton中加入乙個屬性:
public class singleton
那麼,只要呼叫singleton.status就會例項化singleton。而不用等到呼叫getinstance()方法。
延遲載入的單例:
特點:只會在instance第一次使用時建立物件。
缺點:使用了synchronized鎖,併發壞境下對效能產生一定影響。
/**
* 延遲的單例
*/public class lazysingleton
private static lazysingleton instance = null;
public static synchronized lazysingleton getinstance()
}
使用內部類實現的單例:優點:在真正需要時建立物件;效能優越。
public class staticsingleton
private static class singletonholder
public static staticsingleton getinstance()
}
什麼是不變模式:通過使用一種不可改變的物件,依靠物件的不變性,達到在沒有同步操作的多執行緒環境下依然保持內部狀態的一致性和正確性。這就是不變模式。
核心思想:天生對多執行緒友好,物件一旦被建立,它的內部狀態將永遠不會發生改變。別的執行緒不能改變,它自己也不會改變自己。這和唯讀屬性有點區別,唯讀屬性可以自己改變自己。
應用場景滿足兩個條件:
如何實現?需要注意4點:
public final class product
public string getno()
public string getname()
public double getprice()
}
屬性中的final確保所有資料都只賦值一次,定義class為final是不希望被繼承。以免子類破壞該類的不變模式。
jdk中的例子:最典型的是string類,所有元資料的包裝類都是不變模式。
注意:不變模式是通過迴避問題而不是解決問題來處理多執行緒併發訪問控制的,不變物件不需要同步操作。併發中效能上會提高。介紹:生產者-消費者模式是乙個典型的多執行緒設計模式,它為多執行緒間的協作提供了良好的解決方案。在這個模式中,通產有兩類執行緒,若干個生產者執行緒和若干個消費者執行緒,還有乙個共享記憶體緩衝區。生產者執行緒負責提交使用者請求,消費者執行緒則負責具體處理生產者提交的任務。生產者和消費者之間通過共享記憶體緩衝區進行通訊。基本結構:
特點:生產者和消費者解耦,兩者都不需要知道對方的存在。允許消費者和生產者之間存在時間差。
具體結構:
![生-消_2019-09-27_15-09-37](d:\user\80004133\pictures\生-消_!(
例子:實現乙個基於生產者-消費者求整數平方的並行程式
生產者:它構建pcdata物件,並放入blockingqueue佇列中。
public class producer implements runnable
@override
public void run()
}} catch (interruptedexception e)
}public void stop()
}
消費者:從blockingqueue中取得pcdata物件,並進行相應計算。
public class consumer implements runnable
@override
public void run() * = ", data.getintdata(), re));
thread.sleep(r.nextint(sleeptime));}}
} catch (interruptedexception e) }}
共享資料模型:pcdata
public class pcdata
public pcdata(string d)
public int getintdata()
@override
public string tostring() ';}}
主函式:建立乙個生產者和消費者共用的共享緩衝區,建立生產者和消費者執行緒,並提交到執行緒池。
class main
}
現成的disruptor框架是乙個無鎖的快取框架。
介紹:disruptor框架使用無鎖的方式實現了乙個環形佇列,非常適用於生產者-消費者模式,比如事件和訊息發布。
消費者如何監控緩衝區中的資訊呢?,disruptor提供了幾種策略:
什麼是偽共享問題?
為了提高cpu速度,cpu有乙個快取記憶體cache。在快取記憶體中,讀寫資料的最小單位為快取行,它是從主存(memory)複製到快取(cache)的最小單位。
如果兩個變數存放在乙個快取行時,在多執行緒訪問中,可能會相互影響彼此的效能。如圖,當cpu1的x被修改,cpu2上的快取行就會變成無效,導致cache無法命中。如果cpu不能命中快取,系統的吞吐量就會下降。
解決辦法:
讓x變數一行,行的空位置讓padding填充。這樣,就能保證x被修改時,cpu2的快取不會失效。
並行演算法 並行演算法的初步認識
今年的課程中增加了,並行演算法的課程,我一看,一門課程都掛上 演算法 了,肯定厲害呀。這我可要認真學習它。我把我自己的見解和大家分享一下,要是有錯誤的地方一定要指出啊。這是我畫的乙個思維導圖,好像是什麼也看不出來。咱們按照順序乙個乙個的介紹哈。我不知道大家是什麼情況,我是從小學開始,學什麼都是從定理...
並行程式設計與PLINQ 任務並行
任務並行 在tpl當中還可以使用parallel.invoke方法觸發多個非同步任務,其中 actions 中可以包含多個方法或者委託,paralleloptions用於配置parallel類的操作。public static void invoke action actions public st...
Oracle並行模式(Parallel)
1.例項 1 insert 加速 2.用途 強行啟用並行度來執行當前sql。這個在oracle 9i之後的版本可以使用,之前的版本現在沒有環境進行測試。也就是說,加上這個說明,可以強行啟用oracle的多執行緒處理功能。舉例的話,就像電腦裝了多核的cpu,但大多情況下都不會完全多核同時啟用 2核以上...