我們設置三個對象分別同時搶20張票,利用多線程實現.
1 public class Web123506 implements Runnable{ 2 private int ticteksNums=20;//票數 3 4 @Override 5 public void run() { 6 while (true){ 7 if(ticteksNums<0){ 8 break; 9 } 10 /* try { 11 //睡眠 12 Thread.sleep(200); 13 } catch (InterruptedException e) { 14 e.printStackTrace(); 15 }*/ 16 System.out.println(Thread.currentThread().getName()+"-->搶到了"+ticteksNums--); 17 18 } 19 } 20 21 public static void main(String[] args) { 22 // 一份資源 23 Web123506 web = new Web123506(); 24 //多個代理 25 new Thread(web,"我們").start(); 26 new Thread(web,"你們").start(); 27 new Thread(web,"黃牛黨").start(); 28 29 } 30 31 }
運行結果為:
我們-->搶到了20
黃牛黨-->搶到了18
你們-->搶到了19
黃牛黨-->搶到了16
我們-->搶到了17
黃牛黨-->搶到了14
你們-->搶到了15
黃牛黨-->搶到了12
我們-->搶到了13
黃牛黨-->搶到了10
你們-->搶到了11
黃牛黨-->搶到了8
我們-->搶到了9
黃牛黨-->搶到了6
你們-->搶到了7
黃牛黨-->搶到了4
我們-->搶到了5
黃牛黨-->搶到了2
你們-->搶到了3
黃牛黨-->搶到了0
我們-->搶到了1
結論:
我們可以看到搶到的票沒有重復的,說明線程是安全的.
這時候我們加入線程的睡眠.觀察線程此時是不是安全的?
1 public class Web123506 implements Runnable{ 2 private int ticteksNums=20;//票數 3 4 @Override 5 public void run() { 6 while (true){ 7 if(ticteksNums<0){ 8 break; 9 } 10 try { 11 //睡眠 12 Thread.sleep(200); 13 } catch (InterruptedException e) { 14 e.printStackTrace(); 15 } 16 System.out.println(Thread.currentThread().getName()+"-->搶到了"+ticteksNums--); 17 18 } 19 } 20 21 public static void main(String[] args) { 22 // 一份資源 23 Web123506 web = new Web123506(); 24 //多個代理 25 new Thread(web,"我們").start(); 26 new Thread(web,"你們").start(); 27 new Thread(web,"黃牛黨").start(); 28 29 } 30 31 }
運行結果:
黃牛黨-->搶到了20
我們-->搶到了19
你們-->搶到了18
黃牛黨-->搶到了17
我們-->搶到了16
你們-->搶到了15
黃牛黨-->搶到了14
我們-->搶到了13
你們-->搶到了12
你們-->搶到了11
我們-->搶到了10
黃牛黨-->搶到了9
你們-->搶到了8
我們-->搶到了7
黃牛黨-->搶到了6
你們-->搶到了5
我們-->搶到了4
黃牛黨-->搶到了3
你們-->搶到了2
我們-->搶到了1
黃牛黨-->搶到了0
你們-->搶到了-1
我們-->搶到了-1
結論:
當我們加入線程的睡眠,此時搶到的票可能出現了負數或者會出現兩個人搶到了同一張票此時說明加入線程睡眠線程是不安全的.