タグ付けされた質問 「concurrency」

コンピュータサイエンスでは、同時実行性は複数の計算を重複する期間で実行できるシステムの特性です。計算は、同じチップの複数のコアで実行されたり、同じプロセッサでプリエンプティブに時分割されたスレッドで実行されたり、物理的に分離されたプロセッサで実行されたりします。

6
Javaで最高の同時実行リストを選択する[終了]
休業。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善してみませんか?この投稿を編集して質問を更新し、事実と引用で回答できるようにします。 2年前休業。 この質問を改善する スレッドプールには固定数のスレッドがあります。これらのスレッドは、共有リストに対して頻繁に書き込みおよび読み取りを行う必要があります。 では、java.util.concurrentこの場合、パッケージ内のどのデータ構造(リストであることが望ましい、モニターフリーである必要があります)が最適ですか?
98 java  concurrency 

9
なぜi ++はアトミックではないのですか?
なぜi++Javaではアトミックではないのですか? Javaを少し深くするために、スレッド内のループが実行される頻度を数えようとしました。 だから私は private static int total = 0; メインクラスで。 2つのスレッドがあります。 スレッド1:プリント System.out.println("Hello from Thread 1!"); スレッド2:プリント System.out.println("Hello from Thread 2!"); そして、スレッド1とスレッド2によって印刷された行を数えますが、スレッド1の行+スレッド2の行は、印刷された行の総数と一致しません。 これが私のコードです: import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.logging.Level; import java.util.logging.Logger; public class Test { private static int total = 0; private static int countT1 = 0; private static int …


7
静的変数はスレッド間で共有されますか?
スレッドの上級Javaクラスの私の先生は、私にはわからないことを言っていました。 彼は、以下のコードは必ずしもready変数を更新するとは限らないと述べた。彼によると、特に各スレッド(メインスレッドとReaderThread)が独自のプロセッサで実行されているため、2つのスレッドが必ずしも静的変数を共有していないため、同じレジスタ/キャッシュ/ etcと1つのCPUを共有していない他を更新しません。 基本的readyに、メインスレッドで更新される可能性はありますが、では更新されない可能性があるReaderThreadため、ReaderThread無限にループします。 彼はまた、プログラムが0またはを印刷することは可能であると主張した42。どの42ように印刷できるか理解していますが、できません0。彼numberは、変数がデフォルト値に設定されている場合にこれが当てはまるだろうと述べました。 静的変数がスレッド間で更新されることが保証されていないのではないかと思ったのですが、これはJavaにとって非常に奇妙な印象を受けます。ready揮発性にすることでこの問題は修正されますか? 彼はこのコードを示しました: public class NoVisibility { private static boolean ready; private static int number; private static class ReaderThread extends Thread { public void run() { while (!ready) Thread.yield(); System.out.println(number); } } public static void main(String[] args) { new ReaderThread().start(); number = 42; ready = true; …

6
ConcurrentLinkedQueueの使用方法
ConcurrentLinkedQueueJavaでどのように使用しますか? これを使用LinkedQueueすると、キューの同時実行性を心配する必要がありますか?または、2つのメソッドを定義する必要がありますか(1つはリストから要素を取得するため、もう1つはリストに要素を追加するため)。 注:明らかにこれらの2つの方法は同期する必要があります。正しい? 編集:私がやろうとしているのはこれです:キューからアイテムを取得する1つのメソッドを持つクラス(Java)と、キューにアイテムを追加する1つのメソッドを持つ別のクラスがあります。リストに追加され、リストから取得されるアイテムは、自分のクラスのオブジェクトです。 もう1つの質問:removeメソッドでこれを行う必要がありますか? while (queue.size() == 0){ wait(); queue.poll(); } 消費者と生産者はそれぞれ1人だけです。
95 java  concurrency 

6
現在のスレッドを使用するExecutorServiceはありますか?
私が求めているのは、スレッドプールの使用を構成するための互換性のある方法です。理想的には、残りのコードはまったく影響を受けないようにする必要があります。1スレッドのスレッドプールを使用することもできますが、それは私が望むものではありません。何か案は? ExecutorService es = threads == 0 ? new CurrentThreadExecutor() : Executors.newThreadPoolExecutor(threads); // es.execute / es.submit / new ExecutorCompletionService(es) etc
94 java  concurrency 

1
scala.concurrent.Promiseのユースケースは何ですか?
私はSIP-14を読んでおり、その概念Futureは完全に理解でき、理解しやすくなっています。ただし、次の2つの質問がありPromiseます。 SIPは言うDepending on the implementation, it may be the case that p.future == p。どうすればいいの?あるFutureとPromise2つのタイプがありませんか? いつ使用すべきPromiseですか?producer and consumerコード例: import scala.concurrent.{ future, promise } val p = promise[T] val f = p.future val producer = future { val r = produceSomething() p success r continueDoingSomethingUnrelated() } val consumer = future { startDoingSomething() …

9
タイムアウト後にタスクを中断するExecutorService
タイムアウトを指定できるExecutorService実装を探しています。ExecutorServiceに送信されたタスクは、実行にタイムアウトよりも長い時間がかかると中断されます。そのような獣を実装することはそれほど難しい作業ではありませんが、誰かが既存の実装を知っているかどうか疑問に思っています。 以下は、以下の議論に基づいて私が思いついたものです。コメントは? import java.util.List; import java.util.concurrent.*; public class TimeoutThreadPoolExecutor extends ThreadPoolExecutor { private final long timeout; private final TimeUnit timeoutUnit; private final ScheduledExecutorService timeoutExecutor = Executors.newSingleThreadScheduledExecutor(); private final ConcurrentMap<Runnable, ScheduledFuture> runningTasks = new ConcurrentHashMap<Runnable, ScheduledFuture>(); public TimeoutThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, long timeout, TimeUnit timeoutUnit) …

3
Rubyでスレッドセーフでないものを知る方法は?
Rails 4以降、デフォルトではすべてがスレッド環境で実行される必要があります。これが意味することは、私たちが書くコードのすべてであると ALL我々が使用する宝石があることが要求されていますthreadsafe だから、私はこれについていくつか質問があります: ruby / railsでスレッドセーフでないものは何ですか?対ルビー/レールのスレッドセーフは何ですか? スレッドセーフまたはその逆であることが知られている宝石のリストはありますか? スレッドセーフな例ではないコードの一般的なパターンのリストはあり@result ||= some_methodますか? Hashetcなどのruby langコアのデータ構造はスレッドセーフですか? MRIでは、GVL/GILを除いて一度に実行できるルビスレッドが1つだけであることを意味する/IOがありますが、スレッドセーフな変更は影響を及ぼしますか?

8
関数型言語(具体的にはErlang)はどのように/なぜ適切にスケーリングしますか?
しばらくの間、関数型プログラミング言語と機能の可視性の高まりを見てきました。私はそれらを調べましたが、上訴の理由はわかりませんでした。 その後、最近、CodemashでのKevin Smithの "Basics of Erlang"プレゼンテーションに参加しました。 私はプレゼンテーションを楽しみ、関数型プログラミングの属性の多くにより、スレッド化/同時実行の問題を回避することがはるかに容易になることを学びました。状態と可変性の欠如により、複数のスレッドが同じデータを変更することが不可能になることを理解していますが、Kevinは(正しく理解していれば)すべての通信はメッセージを通じて行われ、メッセージは同期して処理されます(ここでも同時実行の問題を回避します)。 しかし、Erlangが非常にスケーラブルなアプリケーションで使用されていることを読んだことがあります(Ericssonが最初にそれを作成した理由の全体)。すべてが同期的に処理されるメッセージとして処理される場合、1秒あたり数千のリクエストを効率的に処理する方法を教えてください。それが、非同期処理に移行し始めた理由ではありませんか?複数の操作スレッドを同時に実行することを利用して、スケーラビリティを実現できますか?このアーキテクチャはより安全ですが、スケーラビリティの点で後退しているようです。何が欠けていますか? Erlangの作成者が並行性の問題を回避するために意図的にスレッド化のサポートを回避したことは理解していますが、スケーラビリティを実現するにはマルチスレッド化が必要だと思いました。 関数型プログラミング言語はどのようにして本質的にスレッドセーフでありながら、まだ拡張できるのでしょうか。

6
CountDownLatchとセマフォ
使用する利点はありますか java.util.concurrent.CountdownLatch の代わりに java.util.concurrent.Semaphore? 私の知る限り、次のフラグメントはほぼ同等です。 1.セマフォ final Semaphore sem = new Semaphore(0); for (int i = 0; i < num_threads; ++ i) { Thread t = new Thread() { public void run() { try { doStuff(); } finally { sem.release(); } } }; t.start(); } sem.acquire(num_threads); 2:CountDownLatch final CountDownLatch latch …

7
セマフォ-初期カウントの用途は何ですか?
http://msdn.microsoft.com/en-us/library/system.threading.semaphoreslim.aspx セマフォを作成するには、初期カウントと最大カウントを指定する必要があります。MSDNによると、初期カウントは- 同時に許可できるセマフォの最初の要求数。 最大数は 同時に許可できるセマフォのリクエストの最大数。 最大数は、リソースに同時にアクセスできるスレッドの最大数であることが理解できます。しかし、初期カウントの使用は何ですか? 初期カウントが0で最大カウントが2のセマフォを作成すると、どのスレッドプールスレッドもリソースにアクセスできなくなります。初期カウントを1に設定し、最大カウントを2に設定すると、スレッドプールスレッドのみがリソースにアクセスできます。初期カウントと最大カウントの両方を2に設定した場合にのみ、2つのスレッドがリソースに同時にアクセスできます。それで、私は最初のカウントの重要性について本当に混乱していますか? SemaphoreSlim semaphoreSlim = new SemaphoreSlim(0, 2); //all threadpool threads wait SemaphoreSlim semaphoreSlim = new SemaphoreSlim(1, 2);//only one thread has access to the resource at a time SemaphoreSlim semaphoreSlim = new SemaphoreSlim(2, 2);//two threadpool threads can access the resource concurrently

9
SimpleDateFormatへのアクセスの同期
SimpleDateFormatのjavadocには、SimpleDateFormatが同期されていないことが記載されています。 「日付形式は同期されません。スレッドごとに個別の形式インスタンスを作成することをお勧めします。複数のスレッドが同時に形式にアクセスする場合は、外部で同期する必要があります。」 しかし、マルチスレッド環境でSimpleDateFormatのインスタンスを使用するための最良のアプローチは何ですか。これは私が考えたいくつかのオプションです。過去にオプション1と2を使用しましたが、より良い代替策があるかどうか、またはこれらのオプションのどれが最高のパフォーマンスと同時実行性を提供するかを知りたいと思います。 オプション1:必要に応じてローカルインスタンスを作成する public String formatDate(Date d) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); return sdf.format(d); } オプション2:SimpleDateFormatのインスタンスをクラス変数として作成しますが、インスタンスへのアクセスを同期します。 private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); public String formatDate(Date d) { synchronized(sdf) { return sdf.format(d); } } オプション3:スレッドごとにSimpleDateFormatの異なるインスタンスを格納するThreadLocalを作成します。 private ThreadLocal<SimpleDateFormat> tl = new ThreadLocal<SimpleDateFormat>(); public String formatDate(Date d) { SimpleDateFormat sdf = …

10
複数のプロセスがリスニングソケットを共有する方法はありますか?
ソケットプログラミングでは、リスニングソケットを作成し、接続するクライアントごとに、クライアントの要求を処理するために使用できる通常のストリームソケットを取得します。OSは、バックグラウンドで着信接続のキューを管理します。 2つのプロセスが同じポートに同時にバインドすることはできません-とにかく、デフォルトで。 プロセスの複数のインスタンスを起動する方法(よく知られているOS、特にWindowsの場合)があり、それらがすべてソケットにバインドされ、キューを効果的に共有する方法があるかどうか疑問に思っています。次に、各プロセスインスタンスをシングルスレッド化できます。新しい接続を受け入れるときにブロックするだけです。クライアントが接続すると、アイドルプロセスインスタンスの1つがそのクライアントを受け入れます。 これにより、各プロセスが非常にシンプルなシングルスレッド実装を持ち、明示的な共有メモリを介さない限り何も共有せず、ユーザーはより多くのインスタンスを起動して処理帯域幅を調整できます。 そのような機能はありますか? 編集:「なぜスレッドを使用しないのですか?」明らかにスレッドはオプションです。ただし、1つのプロセスに複数のスレッドがある場合、すべてのオブジェクトは共有可能であり、オブジェクトが共有されないようにするか、一度に1つのスレッドからしか見えないようにするか、完全に不変であり、最も人気のある言語となるように細心の注意を払う必要があります。ランタイムには、この複雑さを管理するための組み込みサポートがありません。 少数の同一のワーカープロセスを開始することで、デフォルトが共有されない並行システムが得られ、正確でスケーラブルな実装を構築することがはるかに容易になります。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.