1. 程式人生 > 其它 >測試執行緒不同步,優化鎖的列子;

測試執行緒不同步,優化鎖的列子;

技術標籤:後端java

寫了一個測試類threadTest; 直接上程式碼;

  /*沒有加鎖;執行出現小於預期值603*/
    public static  int num= 0;
    @Test
    public void test1(){
        for(int i=0;i<=2;i++){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try{
                        Thread.sleep(10);
                    }catch (InterruptedException e){
                        e.printStackTrace();
                    }
                    for(int j=0;j<=200;j++){
                        num++;
                    }
                }
            }).start();
        }
        try {
            Thread.sleep(1000);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        System.out.print(num);

    }

在這裡插入圖片描述
解決方法一;通過同步鎖解決;

/*運用同步鎖解決執行緒不同步*/
    @Test
    public void test2(){
        for(int i=0;i<=2;i++){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try{
                        Thread.sleep(10);
                    }catch (InterruptedException e){
                        e.printStackTrace();
                    }
                    for(int j=0;j<=200;j++){
                       synchronized (threadTest.class){
                           num++;
                       }
                    }
                }
            }).start();
        }
        try {
            Thread.sleep(1000);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        System.out.print(num);

    }

缺點;synchronized 屬於重量級鎖;

解決方法二;優化synchronized ,使用原子性操作;

 /**
     * 原子類操作包 基礎型別的封裝類字首加Atomic
     */
    /*通過原子性操作,優化鎖;原來是同步鎖(synchronized)*/
    public static  AtomicInteger count = new AtomicInteger(0);
    public static void main(String[] arg) throws Exception{

        for(int i=0;i<=2;i++){
          new Thread(new Runnable() {
              @Override
              public void run() {
                  try{
                      Thread.sleep(10);
                  }catch (InterruptedException e){
                      e.printStackTrace();
                  }
                    for(int j=0;j<=200;j++){
                            count.incrementAndGet();
                    }
              }
          }).start();
        }
        try {
            Thread.sleep(100);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        System.out.print(count);
    }