JAva同時プログラミングの概要


同時プログラミングの目的は、プログラムの実行をより速くすることですが、より多くのスレッドを起動してプログラムを最大限に同時実行できるわけではありません.スレッドはjava言語の重要な機能であり、複雑なシステムの開発を簡素化しています.スレッドは軽量レベルのプロセスとも呼ばれ、多くの現代のオペレーティングシステムでは、プロセスではなくスレッドを基本スケジューリング単位としています.同時の簡単な例:初期のコンピュータにはオペレーティングシステムが含まれておらず、最初から最後まで1つのプログラムしか実行されず、このプログラムはコンピュータ内のすべてのリソースにアクセスできます.これにより、プログラムの作成と実行が困難になるだけでなく、リソースの無駄になります.オペレーティングシステムの登場により、コンピュータは複数のプログラムを実行するたびに、異なるプログラムを個別のプロセスで実行できます.オペレーティングシステムは、メモリ、ファイルハンドル、セキュリティ証明書など、独立したプロセスごとにさまざまなリソースを割り当てます.必要に応じて、ソケット、信号プロセッサ、共有メモリ、信号量、ファイルなど、異なるプロセス間で、いくつかの粗粒度の通信メカニズムによってデータを交換することができます.スレッドを使用するメリットは何ですか?1.マルチプロセッサの強力な能力を発揮する.2.モデリングの簡単さ.3.非同期イベントの簡略化処理.4.応答性の高いユーザーインタフェース.もちろんスレッドにもリスクがありますが、どんなリスクがありますか?1.セキュリティの問題(非常に複雑な問題)2.活発性の問題.3.パフォーマンスの問題.マルチスレッドのプログラムでは、スレッドスケジューラがアクティブなスレッドを一時的に停止し、別のスレッドを実行すると、コンテキスト切替操作が頻繁に発生し、この操作は大きなオーバーヘッドをもたらします.コンテキスト切り替えとは?CPUはタイムスライス割り当てアルゴリズムによりタスクをループ実行し,現在のタスクが1つのタイムスライスを実行すると次のタスクに切り替わる.ただし、切り替え前に前のタスクのステータスが保存され、次回このタスクに切り替えたときにこのタスクのステータスを再ロードできるようになります.したがって,タスクの保存から再介在物iへのプロセスはコンテキストの切り替えである.しかし、マルチスレッドを使うのはきっと速いですか?次のプログラムを検証します.
package chapterOne;
/**
 * @author acer
 *             
 */
public class ConcurrencyTest {
    private static final long count = 10000l;

    public static void main(String[] args) {
        try {
            concurrency();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        serial();
    }

    /**
     *       
     * @throws InterruptedException
     */
    public static void concurrency() throws InterruptedException{
        long start = System.currentTimeMillis();
        Thread thread = new Thread(new Runnable(){

            @Override
            public void run() {
                int a = 0;
                for(long i=0;i5;
                }
            }
        });
        thread.start();
        int b = 0;
        for(long i=0;ilong time = System.currentTimeMillis()-start;
        System.out.println("concurrency:"+time);
    }

    public static void serial(){
        long start = System.currentTimeMillis();
        int a = 0;
        for(long i=0;i5;
        }
        int b = 0;
        for(long i=0;ilong time = System.currentTimeMillis();
        System.out.println("serial:"+time);
}
}

実行結果はシリアル0同時1である.合併すれば必ず速くなるわけではない.これは、スレッドの作成とコンテキスト切り替えのオーバーヘッドがあるためです.ime); 「`実行結果はシリアル0同時実行です.1.同時実行が必ずしも速くないわけではありません.これはスレッドがあるからです.コンテキストの切り替えを減らすにはどうすればいいのでしょうか.よく使われる方法はいくつかあります.1.ロックなし同時プログラミング2.CASアルゴリズム3.最小スレッドと使用協程を使います.初めてこのコンパイラを使うのは、ちょっと慣れていませんが、このブログは続きます.