問題タブ [java-memory-model]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Javaでseqlockを効率的に実装することは可能ですか?
別の質問から、Javaの揮発性バージョンカウンターを使用してseqlockを効率的に実装できるかどうか疑問に思いました。
これが典型的な実装です。この場合、ライタースレッドは1つだけになります。
基本的な考え方は、書き込みの前後にバージョン番号をインクリメントし、読者がバージョン番号が同じで偶数であることを確認することで「一貫した」読み取りが行われたことを確認することです。奇数は「書き込み中」を示します。
バージョンは揮発性であるため、ライタースレッドとリーダースレッドの主要なアクションの間には、あらゆる種類の発生前の関係があります。
ただし、(2)での書き込みが(1)の上に移動して、リーダーに書き込みの進行状況が表示されるのを妨げる原因がわかりません。
たとえば、各行の横にあるコメントのラベルを使用した、次の揮発性の読み取りと書き込みの同期順序(揮発性data
ではないため、同期順序の一部ではない読み取りと書き込みも表示され、インデントされています)。
5(データの読み取り)と2b(データの2回目の書き込み)の間に発生しないというISTM。したがって、読み取りの前に2bが発生し、誤ったデータが読み取られる可能性があります。
それが本当なら、助けとして宣言write()
しsynchronized
ますか?
java - オブジェクトの安全なパブリケーションに関する final と volatile の保証
実際のJava並行性という本から:
オブジェクトを安全に発行するには、オブジェクトへの参照とオブジェクトの状態の両方を同時に他のスレッドから見えるようにする必要があります。適切に構築されたオブジェクトは、次の方法で安全に公開できます。
静的初期化子からのオブジェクト参照の初期化
それへの参照を volatile フィールドまたは AtomicReference に格納する
それへの参照を適切に構築されたオブジェクトの final フィールドに格納する
それへの参照を、ロックによって適切に保護されたフィールドに格納します。
私の質問は次のとおりです。
- 箇条書き 2 と 3 の違いは何ですか? オブジェクトの安全な公開に関する
volatile
アプローチとアプローチの違いに興味があります。final
- ポイント 3 で適切に構築されたオブジェクトのfinal フィールドとはどういう意味ですか? 箇条書きのポイントを開始する前に、著者は適切に構築されたオブジェクトについて話していることをすでに述べました (これは、
this
エスケープへの参照を許可していないと思います)。しかし、なぜ彼らは適切に構築されたオブジェクトについて言及したのでしょうか?
java - OutOfMemoryError:Railsコンソールでjrubyを実行しているが、-J-Xmxで定義されているすべてのメモリを使用していない場合のJavaヒープスペース
私はjruby1.7を使用するRails3アプリを持っており、大量のメモリを必要とする状況で、ローカル開発環境(OS X10.8とjdk7)でRailsコンソールを使用しようとしています。Railsコンソールを次のように実行します。
jruby -J-Xms1024m -J-Xmx4096m -J-XX:+ UseConcMarkSweepGC -J-XX:+ CMSIncrementalMode -S rails c samuel_hml
次に、railsconsole/を使用して長時間実行プロセスを開始します。
「OutOfMemoryError:Javaヒープスペース」エラーが発生した後、jrubyjavaプロセスは常に失敗します。しかし、コンソールを実行してActivity Monitorを確認すると、実際には700MBを超える容量を使用することはありません。
java - JVMはアレイからの複数の読み取りを最適化できますか
同じインデックスを複数回読み取る場合、JVMは配列の読み取りを最適化できますか?次のことを考慮してください。
array[i]
ループ内で2回読み取られます。ループ内で再割り当てされていないと仮定するarray[i]
と、JVMarray[i]
は変更されていないと仮定して、その値を1回だけ読み取ることができますか?array
は渡された可変オブジェクトであるため、1回目の読み取りと2回目の読み取りの間で変更された可能性があります。
生成されたバイトコードを確認しましたが、実際には2回読み取られますarray[i]
(daload
)。JVMはこれを1つの読み取りに最適化することを許可されていますか?
java - スレッド「AWT-EventQueue-0」の例外私のvector3クラスのjava.lang.NullPointerException
さて、私はこのnull Pointer例外を受け取りましたが、私も講師もそれを理解できません。(彼はその悪い論理を考慮し、私は同意する傾向があります)
私は自分の3Dオブジェクトを作成し、それを直接ワールドでレンダリングして、xとyの座標をスクリーンペースで調整しています。これにより、演習に必要なものが正確に得られ、コースコンピュータに多くのフレームをドロップすることなく(つまり、講師のnullポインタを再現できない)、スムーズなレンダリングを実現するために数値を調整できますが、実行するとすぐに自宅のビーストマシンはコードフレームがはるかに高速になっているように見え、コンソールにnullポインター例外を吐き出している間(数値を操作してすべてを遅くした場合でも)、レンダリングしているキューブが繰り返し点滅します。ただし、クラッシュすることはありません。
使用されているクラスは次のとおりです。
Viewport.java(JFrameにアタッチ)
Cube.java
Vertex.java
Vector3.java
私ができる最善のことはpublic double x(){return xyz[0];}
、ビューポートクラスでpaintメソッドが呼び出されたときにVector3クラスでそれをトレースすることですが、ステップスルーしようとすると、それらがnullになることはありません。回転中に頂点に新しい位置を再割り当てしようとしているときに、jvmがそれ自体に追いついているような印象を受けます。
編集:スタックトレース
追加情報:
Manager.java
Wind.java
Props.java
props.props
dirs.dir
java - Java並行性における「プログラム順序規則」の解釈
プログラム順序ルールには、「スレッド内の各アクションが発生する-プログラム順序の後半にあるそのスレッド内のすべてのアクションの前に」と記載されています。
1.別のスレッドでアクションが
- 変数の読み取りと書き込み
- モニターのロックとロック解除
- スレッドの開始と結合
これは、読み取りと書き込みを順番に変更できるが、2行目または3行目で指定されたアクションでは読み取りと書き込みの順序を変更できないことを意味しますか?
2.「プログラムオーダー」とはどういう意味ですか?
例を挙げた説明は本当に役に立ちます。
追加の関連質問
次のコードがあるとします。
まず、物事をシンプルに保つためのシングルスレッドアプリケーションです。コンパイラは、時間を2回チェックする必要があることと、周囲の時間注記行との依存関係がないコードのブロックに気付くため、コードを再編成する可能性があり、その結果、Block1がタイミング呼び出しに囲まれなくなる可能性があります。実際の実行中(たとえば、Line1-> Line2-> Block1の順序を検討してください)。しかし、私はプログラマーとして、Line1、2とBlock1の間の依存関係を見ることができます。Line1はBlock1の直前にある必要があり、Block1は完了するまでに有限の時間がかかり、Line2がすぐに続きます。
だから私の質問は:私はブロックを正しく測定していますか?
- はいの場合、コンパイラが順序を並べ替えることを妨げているのは何ですか。
- いいえの場合(遠野の答えを読んだ後は正しいと思います)、それを防ぐために何ができますか。
PS:最近SOで尋ねた別の質問からこのコードを盗みました。
websphere - WAS の 1 つのインスタンスにデプロイされた EAR は同じヒープ領域を共有しますか?
webpher アプリケーション サーバーが実行されている場合。基本的に、1 つの JVM を実行しています。2 つの EAR プロジェクトを WAS にデプロイする場合、これら 2 つの EARS は同じ JVM を共有しますか。はい、そうだと思います。
しかし、私の質問は、これら 2 つの EAR も同じヒープ スペースを共有するのでしょうか? 私の推測ではノーですが、どうしてそれが可能なのでしょうか? 1 つの jVM は 1 つのヒープしか提供しませんよね?
簡単にするために、WAS は 1 つだけで、ノードもクラスターもないとします。
java - 不変オブジェクトのすべてのプロパティは final でなければなりませんか?
不変オブジェクトはすべてのプロパティが である必要がありますfinal
か?
私によれば、そうではありません。しかし、私が正しいかどうかはわかりません。
java - final 以外のフィールドを持つ不変オブジェクトは、どのようにスレッドセーフではないのでしょうか?
これがあると言う
このスレッドが危険な理由は何ですか? この質問に続きます。