『Javaプログラム性能最適化』学習ノートIII並列プログラム最適化

8863 ワード

第四章並列プログラム最適化4.1並列プログラム設計モード4.2 JDKマルチタスク実行フレームワーク4.3 JDK並列データ構造4.4並列制御方法4.5ロックの性能と最適化4.6無ロック並列計算
1.非ブロック同期はロックに基づく同期の欠陥を回避し、ロックレスアルゴリズムはロック競争によるシステムオーバーヘッドもスレッド間の頻繁なスケジューリングによるオーバーヘッドもない.CASアルゴリズム:3つのパラメータCAS(v,e,n)を含む.Vは更新する変数を表し、Eは予想値を表し、Nは新しい値を表す.JDKのjava.util.concurrent.atomicパッケージの下には,AtomicInteger/ATomicIntegerArray/ATomicLongArrayなど,無ロックアルゴリズムを用いて実現される原子操作クラスのセットがあり,
整数,整数配列,長整形配列などのマルチスレッド安全操作をそれぞれパッケージした.
次のようになります.
public class AtomicTest {



    public static final int MAX_THREADS=3; 

    public static final int TASK_COUNT=3; 

    public static final int TARGET_COUNT=10000; 

    private AtomicInteger account=new AtomicInteger(0);//         

    private int  count=0;

    

    //     

    private synchronized int add() {

        return count++;

    }

    

    //     

    private synchronized int getCount() {

        return count;

    }

    

    //          

    public class SynchThread implements Runnable{

        

        protected String name;

        protected long starttime;

        AtomicTest out;

        public  SynchThread(AtomicTest o,long starttime) {

            out=o;

            this.starttime=starttime;

        }



        @Override

        public void run() {

            int v=out.add();//     

            while (v<TARGET_COUNT) {

                v=out.add();//

            }

            long endtime=System.currentTimeMillis();//          ms

            System.out.println("SynchThread spend:"+(endtime-starttime)+"ms");

        }

    }

    //          

    public class AtomicThread implements Runnable{

        

        protected long starttime;

        

        public AtomicThread(long starttime){

            this.starttime=starttime;

        }

        

        @Override

        public void run() {

            int v=account.incrementAndGet();

            while(v<TARGET_COUNT){

                v=account.incrementAndGet();

            }

            long endtime=System.currentTimeMillis();

            System.out.println("AtomicThread spend:"+(endtime-starttime)+"ms");

        }    

    }

    

    /**

     * JUnit    

     * @throws InterruptedException

     */

    @Test

    public void testAtomic() throws InterruptedException {

        ExecutorService exe=Executors.newFixedThreadPool(MAX_THREADS);//       

        long starttime=System.currentTimeMillis();

        AtomicThread atomic=new AtomicThread(starttime);

        

        for(int i=0;i<TARGET_COUNT;i++){

            exe.submit(atomic);//          

        }

        Thread.sleep(1000);//    

    }



//    @Test

    public void testSynch() throws InterruptedException {

        ExecutorService exe=Executors.newFixedThreadPool(MAX_THREADS);

        long starttime=System.currentTimeMillis();

        SynchThread synch=new SynchThread(this,starttime);

        

        for(int i=0;i<TARGET_COUNT;i++){

            exe.submit(synch);

        }

        Thread.sleep(1000);

        //         

        System.out.println(exe.isTerminated());

        }

}

 
3.Aminoフレームワーク.ロックレスアルゴリズムを使用する主な欠点は、アプリケーション層でスレッド間の競合問題を処理する必要があることである.Aminoは、スレッドのセキュリティに使用できるロックレスアルゴリズムに基づくいくつかのデータ構造を提供し、マルチスレッドスケジューリングモードを内蔵しています.4.Amino集合.5.Aminoツリー.6.Amino図.7.Amino単純スケジューリングモード、最も典型的なのはMaster-workerモードです.Aminoは2つの実装,すなわち静的および動的実装を提供した.
 
4.7協程1.スレッドはプロセスのさらなる分割であり,コヒーレンスはスレッドのさらなる分割と理解できる.Lua言語では協程をよく実現した.2.Javaネイティブ言語ではコラボレーションはサポートされておらず、Kilimは流行のコラボレーションフレームワークです.コラボレーションを使用すると、システムをより低コストで、より高い並列性をサポートできます.