張小二求職記の単例モード(三)の決戦マルチスレッド

9602 ワード

M:前回言ったマルチスレッドの単例モードは?


z;わかる

M:一つ書きましょう

package  ;





public class Singleton {

    private static Singleton instance=null;



    

    private Singleton()

    {

        System.out.println(" ");

    }

    

    public  static  Singleton getInstance()

    {

        if(instance==null)

        {

            instance=new Singleton();

        }

        return instance;

        

    }

    

    





    public static void main(String[] args) {

        

        // 50 , getinstance  

        for(int i=0;i<30;i++)

        {

        new Thread(new Runnable(){



            @Override

            public void run() {

               

              System.out.println(Singleton.getInstance());

            }

            

            

        }).start();

        }

        

        

    

    }



}

一部の結果は以下の通りであり,異なるインスタンスが現れたことが分かった.
 

 

 .Singleton@75da931b

 

 

 .Singleton@34780af5

 .Singleton@34780af5

 

 .Singleton@157ee3e5

 .Singleton@157ee3e5

 .Singleton@34780af5

 .Singleton@2b1be57f

 .Singleton@157ee3e5

 .Singleton@2b1be57f

 .Singleton@60f00e0f

 .Singleton@157ee3e5


synchronizedに参加した結果は以下の通りです.すべてが唯一です.自分でやってみてください.
例構造関数の単例モードSingleton@78214f6b単例モードSingleton@78214f6b単例モードSingleton@78214f6b単例モードSingleton@78214f6b単例モードSingleton@78214f6b一例モード.Singleton@78214f6b

M:synchronizedを使ったんですね。静的な方法を修飾するのは、何に鍵をかけるのかに相当します。


ああ、sinletonに相当する。classロック


M:いいですね。マルチスレッドはプログラムの同時性を高め、プログラムの実行効率を高めることができますが、マルチスレッド自体、特に同期はロックの競争を引き起こします。ロックの競争を減らし、本方法を改造し、他の例を挙げますか。


z:得られた粒度とロックの範囲を減少させる.たとえば、データベースにテーブル・ページの行をロックすると、粒度が低くなり、ロックの競合が減少します.
例えば読み書きロックでは,1つのロックしかないとSSも反発し,ロックを読み書きロックに分割することで競合を減らす.
 
キューのロック解除では、ヘッダにロックを設定し、しっぽにロックを設定することで、ロックの粒度を小さくすることはできません.
パラレルhashmap、

M:ほほほ、よく知っています。コードを書いて、この問題を分析してください。


z:instance=!=nullはロックをかけなくてもいいです.
だから以下のように改造します.
 
package  ;





public class Singleton {

    private static Singleton instance=null;



    

    private Singleton()

    {

        System.out.println(" ");

    }

    

    public  static  Singleton getInstance()

    {

        if(instance==null)

        {

        synchronized(Singleton.class)

        {

        if(instance==null)

        {

            instance=new Singleton();

        }

        }

        }

        return instance;

        

    }

    

    





    public static void main(String[] args) {

        

        // 50 , getinstance  

        for(int i=0;i<30;i++)

        {

        new Thread(new Runnable(){



            @Override

            public void run() {

               

              System.out.println(Singleton.getInstance());

            }

            

            

        }).start();

        }

        

        

        

        

               



    

    }



}

 

M:二重ロック検査、どうして二重ロックするの?


ステップ1:同期ブロックに入るのは空のみです.インスタンスがあれば結果を直接返します.
第2部:空と判断:スレッドの不確実性に従って、2つのスレッドが同時に判断する
if(instance=null)は同期が速く、出現のために2つのインスタンスを作成します.
package  ;





public class Singleton {

    private static Singleton instance=null;



    

    private Singleton()

    {

        System.out.println(" ");

    }

    

    public  static  Singleton getInstance()

    {

        if(instance==null)

        {

        synchronized(Singleton.class)

        {

    

        

            instance=new Singleton();

        

        }

        }

        return instance;

        

    }

    

    





    public static void main(String[] args) {

        

        // 50 , getinstance  

        for(int i=0;i<100;i++)

        {

        new Thread(new Runnable(){



            @Override

            public void run() {

               

              System.out.println(Singleton.getInstance());

            }

            

            

        }).start();

        }

        

        

        

        

        

    

        



    

    }



}

結果の重複
例構造関数単例構造関数単例モードSingleton@46993aaa単例モードSingleton@52e5376a単例モードSingleton@46993aaa単例モードSingleton@46993aaa単例モードSingleton@46993aaa単例モードSingleton@46993aaa単例構造関数単例モードSingleton@157ee3e5単例モードSingleton@46993aaa単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5単例モードSingleton@157ee3e5シングルM:

単例モードは一段落して、次はNIOになります。NIOにはいわゆる観察者モードがあります。はっきり言って、イベント駆動です。NIOはnew ioと呼ばれ、no-blockingとも呼ばれ、非ブロック、Net ioとも呼ばれ、ネットワークプラスioとも呼ばれ、従来のsocketプログラミングを改善するとともに、IO関数を改善し、IOとネットワークプログラミングに重点を置き、ついでに観察者モードを解決し、帰りましょう


 
 
z: