測試執行緒不同步,優化鎖的列子;
阿新 • • 發佈:2020-12-28
寫了一個測試類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); }