多線程請求給靜態變量加鎖的

1、寫在前面
今天在寫一個當每次請求過來定義的一個靜態變量累加的時候遇到很多坑,發現自己對多線程和鎖的理解和使用一竅不通,對Java一些設計模式真的是一知半解!!心生慚愧,感謝部門大佬耐心的講解和幫助!讓我也明白寫程序不能只是使用,還要明白更要弄懂每寫一行代碼的意義! 在csdn已經寫了很久了,這是我第50篇文章,在這裏碎碎念一下,同時也希望看到自己的成長,加油,陌生人! 加油,自己!

2、問題解決及描述
A、在給靜態變量累加的時候專門添加一個方法,用synchronized 來修飾加鎖,保證每次多線程請求的時候拿到的都是累加的! 爲什麼可以用synchronized ,因爲它有一個特點:互斥性,就是:即在同一時間只允許一個線程持有某個對象鎖,通過這種特性來實現多線程中的協調機制,這樣在同一時間只有一個線程對需同步的代碼塊(複合操作)進行訪問。互斥性我們也往往稱爲操作的原子性!

   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、寫在最後
路漫漫其修遠兮,吾將上下而求索!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章