2016-09-29 3 views
2

ここ数週間、私はJavaで並行処理(マルチスレッド)を学んできました。これまでのところJava言語で遭遇し​​たこと(または一般的なプログラミング)とは異なり、難しくてむしろ違います。しばしば、私が小さなコンセプトを完全に理解し始めるまで、私は再び読んで何度も読まなければなりません。私は間違った方法でマルチスレッドを見ていますか? (Java)

Javaプログラミング言語のこの部分が私に大きなトラブルをもたらした理由はわかりました。

通常、私はシングルスレッドプログラムのコードを見ると、メインメソッドを見て、デバッガのように実行全体を通して段階的に進めます。このプロセスを通して、私は、実行中のあらゆる時点で変数とその状態(値)のようなあらゆることを心に留めようとします。しばしば、私はある時点で停止し、プログラムの実行がさまざまなシナリオでどのように変わるかを考えます。私が最初から最後までプログラムを進めることができれば、コードと素材を完全に理解したように感じる。

私は、このアプリケーションを同時アプリケーションに適用しようとすると、一度にsleep()、同期メソッド、組み込みロックの取得、保護されたブロックの使用待ち()など)、何かがいつ実行されるかについての不確実性が非常に高いため、すべてのことについていくことはほとんど不可能になります。それは、私が "何が起こっているのかを制御している"という気持ちを持ちたいが、同時性は不可能だと思うので、私を苛立たせている。

ご迷惑をおかけしますようお願い申し上げます。

+2

私は[programmers.stackexchange](http://programmers.stackexchange.com)がそのような質問のために良い場所だと思います。 –

+0

それを得ました、私は将来心に留めておきます! –

+1

"イベント"(メソッド呼び出しをより正確に)に応答して、ある状態から別の状態に切り替えることで、アプリケーションのさまざまな部分をどのように応答するかについて、状態を見てみましょう。一度それを行うと(シングルスレッドアプリケーションの場合でも)、アプリケーションの各「モジュール」を他のモジュールと(アプリケーションのアーキテクチャを認識して)見ているだけでなく、マルチスレッドを理解することは、ケーキ - 同期が必要な場合を除いて、シングルスレッドとは何も変わりません。 –

答えて

1

同時実行性は単純な概念です。実際には、相互にやりとりできる複数の実行パスがあります。あなたが言及したものは、同期、ブロック、待機などが技術的な詳細、ツールです。

私はいくつかのコーディングを試みることをお勧めします:-)マルチスレッドのプログラムのアイデアを思いついてコードしてください。ある時点で、あなたがリストアップしたツールの1つを使用する必要があります。これは理論でしか理解してはいけないコンセプトではありません^^

+0

mmm ...実際には、並行性は実際は複雑です。そして、同期化は「技術的ツール」として却下することはできません。 Atomicity、Memory Ordering、Locks **は並行プログラミングとは何ですか?また、Out of OderやCache-Choice以外のCPUが内部的に何をしているかを知る必要があるものもあります。さらに、すべての命令は(別の部分でも)潜在的に別のエージェントとインタリーブされてお​​り、プログラムの状態はそれに対処しなければならないことを常に覚えておく必要があります。並行性は単に複数の実行フローではありません。 –

+0

もう一度、それらは本番環境では決して使用しない技術的な詳細です。これは、バイトコードの処理方法などを理解しなければならないため、Javaでのプログラミングが複雑であると言っているようなものです。そうではありませんが、それは重要な深いレベルの技術的な詳細ですが、あなたが魔法をやる必要がある場合に限ります。現代的なアプローチでは、コードの質、シンプルさに重点を置いています.1つまたは2つのライブラリを使用して複雑な作業を行う場合、コグに深く関わる必要はありません。 OPは彼らがコンセプトを理解して使用したいと述べ、それの技術的詳細をすべて知っているわけではない:-) – Kelevandos

1

さらに、科学、コンカレントプログラミングはアートです。

Javaの並行処理に入る前に、概念的なものをまず検討してください。つまり、並行処理の主な問題は何ですか?ロックとは何ですか?セマフォーとは何ですか?何が障壁ですか?なぜ我々はそれらを使用していますか?どのように私たちは変数の保護、同期などのさまざまな目的のためにそれらを使用することができますか?同様にいくつかあります。

次に、言語固有の使用法に入る前に、非常に重要な知識を得るでしょう。

逐次プログラミングに常に従っており、最初に並行性を見ている人にとっては、一度にそれらのことを理解することは間違いありません。しかし、あなたは、あなたが一定時間後に並行プログラミングのための逐次プログラミングのレベルに行くことができると確信しています。 :))

関連する問題