並列・並行
並列(Concurrency)処理:同時に動作するように見せること
シングルCPUコア時代から生まれた考え方
並行(Parallelism)処理:同時に動作すること
マルチCPUコア現代から進化した考え方
※他サイトを参照
★並列処理の分類
・共有メモリ 並行コンポーネント群は共有メモリの内容を更新することで通信を行う
ロックを必要とする
Java、C#
・メッセージパッシング 並行コンポーネント群はメッセージを交換することで通信を行う
Erlang、Haskell
Erlang/Scala Actor&Message
Go goroutine
Java ForkJoinPool
Objective-C Grand Central Dispatch
Java
1.List
Vector setが速い
CopyOnWriteArrayList getが速い
Collections.synchronizedList(List list)
2.Set
CopyOnWriteArraySet getが速い
Collections.synchronizedSet(Set set)
3.Map
Collections.synchronizedMap(Map map)
ConcurrentHashMap 推奨
4.Queue
ConcurrentLinkedQueue 推奨 目的:並列・並行
BlockingQueue 目的:スレッド間に情報の共有
★Concurrency in Java
・Bare Threads
・Executors & CompletionServices
・ForkJoin framework & parallel streams
・Actor model
C#
★Parallelについて
var nums = new int[] { 1, 2, 3, 4, 5 };
// 配列向け
Parallel.For(0, nums.Length, (index) => // index: 0~4
{
nums[index] *= nums[index];
});
var nums = new List<int> { 1, 2, 3, 4, 5 };
// Collection向け
Parallel.ForEach(nums, (index) =>
{
nums[index] *= nums[index];
});
Parallel.Invoke
(
() => { Console.WriteLine("タスク1"); },
() => { Console.WriteLine("タスク2"); },
() => { Console.WriteLine("タスク3"); }
);
★PLINQについて
var nums = new List<int> { 1, 2, 3, 4, 5 };
var query = from p in nums select p; // 結果が順番あり
var queryP = from p in nums.AsParallel() select p; // 結果が順番なし
var queryP = from p in nums.AsParallel().AsOrdered() select p; // 結果が順番あり
queryP.ForAll((item) => { Console.WriteLine(item); }); // 順番を無視
Java并发编程的演进