ホームページ  >  記事  >  Java  >  同期メソッドは非同期メソッドにどのような影響を与えますか?

同期メソッドは非同期メソッドにどのような影響を与えますか?

一个新手
一个新手オリジナル
2017-10-10 09:31:191730ブラウズ

StringBuilder はスレッドアンセーフなクラスです。

StringBuffer 内のメソッドは同期されているため、スレッドセーフです。

今日は、それをテストするコードを書きました。ループを使用して 10 個のスレッドを開き、StringBuffer (StringBuilder) の追加を呼び出して 1 から 10 を加算します。

結果は予想通りです: スレッドセーフでない StringBuilder はいくつかの数値を欠落します。

このとき:ビルダーとバッファーを同時に操作し、最初にバッファーの追加を呼び出すと、ビルダーとバッファーは同じスレッド内にあるため、各操作が実行され、ビルダーのメソッドは「同期」メソッドに変わります。バッファがスレッドをブロックするため、同様に 10 個の数字を追加します


public static void main(String[] args) throws InterruptedException {
        StringBuffer buffer = new StringBuffer();
        StringBuilder builder = new StringBuilder();        // 开启十个线程,分别对buffer 和 builder 操作        
        for(int i = 0; i < 10; i++) {            
            int j = i;            
            new Thread(new Runnable() {                
            public void run() {                    
            try {
                        Thread.sleep(500); //造成阻塞
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    builder.append(j);
                }
            }).start();
        }        //等待以上操作完成
        Thread.sleep(1000);        // 打印结果
        System.out.println("builder:"+builder);
    }

以上が同期メソッドは非同期メソッドにどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。