タグ

JavaとConcurrencyに関するagwのブックマーク (10)

  • 【マルチスレッド】CompletableFutureについて - Qiita

    マルチスレッド処理で他のスレッドから戻り値がある場合がある。 戻り値を受け取る方法としてCompletableFutureがある。 マルチスレッドの中では、1つのスレッドの戻り値を受け取って処理を行いたい場合がある。 その場合、戻り値が必要な処理は、戻り値を受け取るまで処理がブロックされる。 戻り値を返す処理が終了したら、戻り値を取得し、後続の処理を行う。 CompletableFutureは前段の処理が終了したら自動的にその結果を次の処理を渡して実行するようにできる。 CompletableFutureは戻り値のある非同期処理をsupplyAsyncメソッドで起動する。 import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.c

    【マルチスレッド】CompletableFutureについて - Qiita
  • マルチスレッド :: やり直しJava

    スレッドの現在の状態は ThreadクラスのgetState()メソッドで確認することができます。 スレッド間通信と同期スレッド間通信スレッド間通信と言うと 大袈裟な感じもしてしまいますが、スレッド間でデータをやり取りしたり 待ち合わせを行うことを指します。スレッド間通信は共有メモリを介して行います。共有メモリとして利用できるのは ヒープ領域に置かれたインスタンスやクラスフィールド等です。具体的には次のような方法でスレッド間通信を行うことができます。 クラスフィールドを介してスレッド間通信を行う。クラスのシングルトンオブジェクトを介してスレッド間通信を行う。共有するオブジェクトの参照を それぞれのスレッドで持ち合い、共有オブジェクトを通してスレッド間通信を行う。並列処理を行う場合、スレッド間通信が必要なければ シングルスレッドの場合と変わらないので 難しいことは何もありません。しかし 大抵

  • Javaスレッドメモ(Hishidama's Java thread Memo)

    概要 Javaでは、マルチスレッド用のクラスとしてThreadが用意されている。[2017-04-15] しかし新しいJavaでは、Threadを直接使う事はあまり無い。 ExecutorService/Future(JDK 1.5)やFork/Join(JDK 1.7)といったクラスが追加されているので、そちらを使う。 Java21で仮想スレッド(virtual thread)が導入された。[2023-09-23] これにより、従来のスレッドはプラットフォームスレッド(platform thread)と呼ぶようになった。 Javaでは、マルチスレッド用のThreadクラスが用意されている。 Threadを継承して独自のクラスを作り、runメソッドをオーバーライドして処理体を記述する。 class スレッドクラス名 extends Thread { @Override public vo

  • 同期化のパフォーマンス計測 - Kengo's blog

    シルバーウィークのまとまった時間を利用して、同期化のパフォーマンスについて調査。どのように遅いのか・なぜ遅いのかを追いましたが、詳細な内部実装はJVM仮想マシン仕様書にも記載されておらず「なぜ」まではわかりませんでした。 中途半端な内容になりましたが、実施した計測や調べた内容をまとめておきます。 結論 synchronizedブロックは大型クラスのコンストラクタと同等の負荷(キャッシュしたりFlyweightパターンを適用したりしたくなる負荷)と受け取るべき。 volatile修飾子はsynchronizedブロックの約20%の負荷で、比較的軽量であることが確かめられた。 より細かな内部実装を把握するには、JVMのソースコードを読む必要がありそう。 パフォーマンス計測 同期化は遅いと言われるが、ではどの程度遅いのか?を計測。手元の環境*1でシングルスレッドにおけるパフォーマンスを計測した結

    同期化のパフォーマンス計測 - Kengo's blog
  • Javaの並行処理を理解する(入門編) - Qiita

    例えば以下の点について、ちゃんと並行処理を考慮した実装ができていますか? シングルトン インクリメント(++)やデクリメント(--) longやdoubleへの代入 <%! %>タグで宣言された変数 もし、何の考慮もせずにこれらのコードを実装していた場合、 番システムでとんでもないバグを引き起こす可能性があります。 稿では以下の流れに沿って並行処理を解説したいと思います。 並行処理とは 並行処理をなぜ考慮しなければならないのか スレッドセーフな変数とそうでない変数 並行処理はテストが難しい 「並行処理」とは まずはじめにJavaがメモリ上でどのように動作しているかを理解しましょう。 「プロセス」と「スレッド」 プロセス : 各Javaアプリケーションに対してメモリ上に割り当てられた「メモリ空間」と呼ばれる領域で動作する処理単位 スレッド : プロセス上で一行ずつコードを実行する一連のプ

    Javaの並行処理を理解する(入門編) - Qiita
  • Java Compare and Swap Example - CAS Algorithm

  • AtomicIntegerの性能を検証する - Qiita

    マルチスレッドでintを使う そもそもJavaAndroidでintを使う場合,複数のスレッドから演算をするときはロックを取らないといけません.これは1行の演算やインクリメント・デクリメントでも同じです. 例えばi = i + 1を演算する場合,まずiを取得して,1を足してからまたiに代入しますが,取得してから代入するまでに他のスレッドがiの値を変更している可能性があります. i++と書いた場合も同様でインクリメントしている間に値が変わっている可能性があります. アセンブラとかに詳しい人は「インクリメントなんて機械語でアトミックな処理があるじゃん」と思うかもしれませんが,i+=2の場合はロックを取らないといけないことを考えると,言語仕様として一貫性を保つためにもi++はアトミックな処理になっていないのではないか,と想像します. そもそも当に値は変わってるのか 「とはいってもそんなの滅多

    AtomicIntegerの性能を検証する - Qiita
  • マルチコア時代に備えて本気でメモリモデルを理解しておこう - リオーダー & finalフィールド 編 - - かとじゅんの技術日誌

    長い文章になってしまったので、概要だけ先に書きます。 以下のJavaプログラムは、常に上から下に順番に命令が実行されると思いますか?つまり、aに1が格納された後に、bに2が格納されると思いますか? 実は場合によってはこの実行順序が入れ替わる場合があります。これはJavaの言語仕様として定義されていることです。これを考慮しないと信頼性のある並行処理は実装できません。 気になる人は以下を読んでみてください。 a = 1; b = 2; すでにインターネットは社会インフラ化しています。ソーシャルネットワークで多くの人とコミュケーションやコラボレーションできる時代で、個人が情報を作り消費することは当たり前になってきています。そして、インターネット上のコンテンツは増加の一途を辿っています。「情報爆発」なんて言葉も耳慣れた言葉になりましたが、その問題解決のためにMapReduceなどの分散処理技術に注

    マルチコア時代に備えて本気でメモリモデルを理解しておこう - リオーダー & finalフィールド 編 - - かとじゅんの技術日誌
  • IBM Developer

    IBM Developer
  • Clojureをつくったわけ

    The original document appears at http://clojure.org/rationale. The translation is based on November 27, 2009 version of the page. 読みにくくて申し訳ないです。数多くの間違いがあると思いますので、ご指摘ください。 顧客や出資家は、業界標準のプラットフォームであるJava仮想マシン (Java Virtual Machine; JVM) に相当な投資をしており、そのパフォーマンス、セキュリティ、安定性などに満足している。Java開発者は、動的言語の簡潔さ、柔軟さ、生産性をうらやましく思うものの、顧客の環境で動かせるかどうか、既存のコードやライブラリが使えるかどうか、そして動作速度などについて心配するかもしれない。また、ネイティブ・スレッドやロッキングによる並行処理に

  • 1