《零基礎學Java》 線程的同步 在單線程程式中,每次只能做一件事情,後面的事情需要等待第一件事情完成後才可以進行。為此,Java提供了線程同步機制來防止多線程編程中搶占資源的問題。 線程安全 在編寫多線程程式時,應該考慮到線程安全問題。 模擬未考慮到線程安全問題的售票系統: public clas ...
《零基礎學Java》
-
線程的同步
在單線程程式中,每次只能做一件事情,後面的事情需要等待第一件事情完成後才可以進行。為此,Java提供了線程同步機制來防止多線程編程中搶占資源的問題。
-
線程安全
在編寫多線程程式時,應該考慮到線程安全問題。
模擬未考慮到線程安全問題的售票系統:
public class Demo5 implements Runnable { int unm = 10;// 售票池 總票數 public static void main(String[] args) { Demo5 demo5 = new Demo5(); Thread thread1 = new Thread(demo5, "1");// 一號售票機 Thread thread2 = new Thread(demo5, "2");// 二號售票機 Thread thread3 = new Thread(demo5, "3");// 三號售票機 Thread thread4 = new Thread(demo5, "4");// 四號售票機 thread1.start();// 開啟線程 thread2.start(); thread3.start(); thread4.start(); } @Override public void run() { while (true) { if (unm > 0) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("票數:" + unm--); } } } }
模擬未考慮到線程安全問題的售票系統 輸出結果:
-
線程同步機制
同步塊:
Java中提供了同步機制,可以有效的防止資源衝突。同步機制使用 synchronized關鍵字 使用該關鍵字的代碼塊稱為同步塊。
同步塊 語法:
synchronized (Object){ }
同步塊 實例:
public class Demo6 implements Runnable{ int unm = 10;// 售票池 總票數 public static void main(String[] args) { Demo6 demo6 = new Demo6(); Thread thread1 = new Thread(demo6, "a1");// 一號售票機 Thread thread2 = new Thread(demo6, "a2");// 二號售票機 Thread thread3 = new Thread(demo6, "a2");// 三號售票機 Thread thread4 = new Thread(demo6, "a4");// 四號售票機 thread1.start();// 開啟線程 thread2.start(); thread3.start(); thread4.start(); } @Override public void run() { while (true) { synchronized (this){// 同步代碼塊,加鎖對象為自身 if (unm > 0) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("票數:" + unm--); } } } } }
同步塊 實例輸出結果:
同步方法:
同步方法就是被 synchronized關鍵字 修飾的方法。當某個對象調用了同步方法時,該對象的其他方法必須等待該同步方法執行完畢後才能被執行。必須將每個能訪問共用資源的方法都修飾為synchronized,否則會出錯。
同步方法 語法:
synchronized void name(){ }