マルチスレッドが静的変数にロックを要求する

3224 ワード

1、前に书いて今日1つの要求が来るたびに定义する1つの静的変数が累积する时に多くの穴に出会って、自分がマルチスレッドとロックに対する理解と使用が全然分からないことを発见して、Javaのいくつかの设计のモードに対して本当に半分理解しています!!心が恥ずかしくて、部門の大物の辛抱強い説明と助けに感謝します!プログラムを書くのはただ使うだけではなくて、更に1行のコードを書く意味を理解しなければならないことを理解させます!csdnでは長い間書いていましたが、これは私の50番目の文章で、ここで砕いて読んで、同時に自分の成長を見て、頑張って、知らない人を見たいと思っています.がんばって、自分!
2、问题解决と说明A、静的変数を累积する时にわざわざ1つの方法を追加して、synchronizedでロックを修饰して、毎回マルチスレッドの要求の时にもらうのがすべて累积することを保证します!なぜsynchronizedを使用できるのかは、同じ時間に1つのスレッドがオブジェクトロックを持つことを許可することによって、マルチスレッドにおける協調メカニズムを実現し、同期を必要とするコードブロック(複合操作)に同じ時間に1つのスレッドしかアクセスできないという特徴があるからです.反発性は操作の原子性とも呼ばれることが多い.
   public static BigInteger number= new BigInteger("0");

    public static synchronized BigInteger GetNumber() {
    	//                               number  
    	Thread.sleep(3000);
        number= number.add(new BigInteger(1"));
        return number;
    }

   @Test
    public void contextLoads() {

        for (int i = 0; i < 50; i++) {
            Test mythread = new Test ();
            Thread a = new Thread(mythread, "A" + i);
            a.start();
        }
		
		// springboot  test          
        while (true) {
            try {
                Thread.sleep(600000);
            } catch (Exception e1) {
                e1.printStackTrace();
            }
        }

    }
  public class test extends Thread {
  @Override
        public void run() {
            super.run();
            // System.out.println("MyThread");
            String thredName = test.currentThread().getName();
            System.out.println("  :" + thredName + "   ");
            System.out.println(GetNumber());
            System.out.println("  :" + thredName + "   ");           
        }

}


    : (            )
  :A41   
  :A42   
  :A43   
  :A44   
  :A45   
  :A46   
  :A47   
  :A48   
  :A49   
0
  :A0   
1
  :A49   
2
  :A48   
3
  :A47   
4
  :A46   
5
  :A45   
6

B、synchronizedを使用してコードブロックを修飾する(上のコードのように)
public static BigInteger GetNumber2() {
        try {
            Thread.sleep(100L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        number= number.add(new BigInteger("1"));
        return number;
    }
 
 @Test
    public void contextLoads() {

        for (int i = 0; i < 10; i++) {
            test mythread = new test();
            Thread a = new Thread(mythread, "A" + i);
            a.start();
        }

        while (true) {
            try {
                Thread.sleep(600000);
            } catch (Exception e1) {
                e1.printStackTrace();
            }
        }
    }

public class test extends Thread {
        @Override
        public void run() {
            super.run();
           	//     
            synchronized (test.class) {
  
                System.out.println(GetNumber2());
            }
            System.out.println("  :" + thredName + "   ");
        }

    }


    :
  :A0   
  :A1   
  :A2   
  :A3   
  :A4   
  :A5   
  :A6   
  :A7   
  :A8   
  :A9   
0
  :A0   
1
  :A9   
2
  :A8   
3
  :A7   
4
  :A6   
5
  :A5   
6
  :A4   
7
  :A3   
8
  :A2   
9
  :A1   

3、最后の道は长くて、私は上下して求めます!