並列・並行

並列(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

http://akka.io/

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并发编程的演进