Javaスレッドの同時実行とセキュリティの問題の詳細


同時およびスレッドセキュリティの問題の詳細
  • 同時
  • とは
  • スレッド同時セキュリティ問題
  • 同時性とは
    スレッドの同時セキュリティの問題を解決するには、まず同時性とは何かを明らかにします.-スレッドの同時原理:-私たちはまず1つの例を挙げて、あなたが数学の問題をする時同時にテキストを暗記することができますか?一部の学生は一心不乱に何を使うことができますか?普通の人は数学の問題をしながらテキストを暗記することはできないことに気づきます.もしあなたがこの2つのことを同時にしなければならないなら、結果はどうなりますか.シミュレーションしてみましょう.1)問題を書いて、テキストを1つ暗記します.2)数学の問題を終えてから、国語のテキストを暗記します.もちろん、具体的にどうするかはあなたの気持ち次第で、固定的な方法はありません.しかし、同じ時間に数学の問題を書いてテキストを暗記して、何を聞くのか、脳があるからです.-あなたの脳のように、2つの関係のないことを同時にすることはできません.同様に、コンピュータのCPUも2つ以上のスレッドを同時に処理することができず、複数のタスクがあれば複数のタスクが交互にCPUを占有し、実際には複数のスレッドが同時に実行されるわけではない.各スレッドは停止しています(テーマを書いて、テキストを見てください.もちろん、コンカレントは1つのCPUにとって、現在のデュアルコアまたはクアッドコアCPUは複数のタスクを同時に処理することができます).次に、スレッドのコンカレント性をコードで検証します.
    class Two extends Thread{
        public void run(){
            for(int i=1;i<=50;i++){
                System.out.println(i);
            }
        }
    }
    public class TestThread{
            public static void main(String[] args) {
            //   t1  
            Thread t1=new Two();
            //  t2  
            Thread t2=new Two();
            t1.start();
            t2.start();
        }
    }

    上記のコードを複数回実行すると、スレッドの同時性の結果が得られます.
    スレッド同時セキュリティの問題
    同時性を知っていますが、スレッドのセキュリティの問題は何ですか?同じように、まず例を挙げましょう.明ちゃんと紅ちゃんは鍋から餃子をすくい取って、餃子の数は5で、すくい取るごとに1つ減らして、最後に餃子が1つしか残っていない時、明ちゃんは先に見て、それから手を出してすくい取りに行きました.この時、紅ちゃんは目が速くすくいました.この時、鍋には餃子が0つ残っていましたが、明ちゃんももう手を出しました.この時、餃子が1つ残っているはずです.明らかに論理的ではありません.したがって、スレッドセキュリティの問題は、複数のスレッドが同じデータ(臨界リソース)に同時にアクセスすると、このデータを前後して変更して得られるデータの不一致が発生する可能性があることです.一般的な臨界リソース:-マルチスレッド共有インスタンス変数-マルチスレッド共有静的共通変数次はコードでテストします
    public class DemoSyn {
        static Integer num=10;
        public static void main(String[] args) {
            final DemoSyn syn=new DemoSyn();
            Thread t1=new Thread(){
                public void run(){
                    syn.printNum(0);
                }
            };
            Thread t2=new Thread(){
                public void run(){
                    syn.printNum(1);
                }
            };
            t1.start();
            t2.start();
        }
        public  void printNum(int i){
                if(i==0){
                    num=100;
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }else{
                    num=200;
                }
                System.out.println(num);
        }
    }
    

    上記のコードは100200または200100が現れると予想されていますが、実行すると、結果の大部分は100100と200200であることがわかります.これはスレッドの不安全によるものです.次に、スレッドt 1が先に実行されるとnum値が100に変更され、その後、このスレッドがブロックされ、スレッドt 2がCPUを占有し、num値が200に変更されて出力され、1000ミリ秒後にt 1スレッドが実行され続けるが、numの値はt 2スレッドによって変更された理由を分析する.だから結果は200200です(他の答えもこの過程で出すことができます).
    スレッドセキュリティの問題を解決する方法については、次の章の同期非同期、スレッドセキュリティの問題、オブジェクトロックとクラスロック、静的と非静的同期方法を参照してください.