synchronizedで囲む範囲

synchronized-range.png

synchronizedで囲む適切な範囲とは?
synchronized で囲むということは、なにか複数のスレッドによる攻撃から守りたいオブジェクトがあるということです。
トイレに例えるのがよいでしょう。
トイレに入ってる間に、他の人に入って来てほしくないですよね!?
マルチスレッドによって脅かされる、とはトイレの途中に誰かが入って来てしまうようなものです。
synchronizedで囲む適切な範囲は

synchronized(オブジェクト){
   オブジェクトの値の初期化;
   オブジェクトの値をいじる;
 オブジェクトの値のいじるの完了;
}

までの範囲です。
人間のトイレで話を進めるのもアレなので、猫のトイレで例えて話を進めていきましょう。
Integer coverage=0;//おしっこの何%を砂で隠せたのか?
 public void pee() {
            System.out.println("ちちち"+":"+Thread.currentThread().getName());
            synchronized(coverage){
                coverage=0;
                while(coverage<100){//100%砂で隠れるまで、他の猫に邪魔されたくない。。!
                    print("シャッシャッ"+coverage);//砂をかける
                    coverage++;
                }
            }
    }

サポートサイト Wikidot.com