1. 程式人生 > >線程的同步(協調)synchronized

線程的同步(協調)synchronized

while catch 判斷 端口 print name dex inf sleep

多線程同時訪問一個數據池時,可能發生沖突,產生異常數據(理解為:多條公路進入同一城市,車輛無序發生混亂)。

使用Runnable接口管理多線程:可以理解為多條公路(線程)通過一個收費站(Runnable接口),達到車輛(run)有序通過的目的。

if條件盡量前置,否則,先執行再判斷。

【格式】

synchronized void method(){...} 關鍵字在方法前,每次只允許一個線程調用此方法

synchronized(Object){...} 關鍵字在代碼塊前,每次只允許一個線程調用此代碼塊

【舉例】:通過不同方式購買車票後,查詢余票數目。3個線程:手機電腦端、櫃臺、自助售票機

技術分享圖片

class
MyThreadRunnalbe implements Runnable { int num = 10;//車票總數 public void run() {//線程要執行的任務 while (true) { synchronized (this) {//同步(協調)代碼塊 if (num > 0) {//條件盡量前置 try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()
+ "購買,余票:" + num--); } else break; } } } } public class Demo { public static void main(String[] args) { MyThreadRunnalbe mtr = new MyThreadRunnalbe();//創建端口對象(以下3個線程共同使用這1個端口) Thread tA = new Thread(mtr, "手機電腦端");// 以該類對象分別實例化4個線程 Thread tB = new
Thread(mtr, "櫃臺"); Thread tC = new Thread(mtr, "自助售票機"); // //不可以分別new MyThreadRunnalbe(),3個接口使得3個線程各自執行,無法達到有序的目的 // Thread tA = new Thread(new MyThreadRunnalbe(), "手機電腦端"); // Thread tB = new Thread(new MyThreadRunnalbe(), "櫃臺"); // Thread tC = new Thread(new MyThreadRunnalbe(), "自助售票機"); tA.start();// 分別啟動線程 tB.start(); tC.start(); } }

或者,同步(協調)方法sell()

class MyThreadRunnalbe implements Runnable {
    int num = 10;//車票總數

    public void run() {//線程要執行的任務
        while (true) {
            sell();//調用sell方法
            if (num <= 0) break;
        }
    }

    public synchronized void sell() {//創建sell方法,並同步(協調)

        if (num > 0) {//條件盡量前置
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "購買,余票:" + num--);
        }
    }
}

public class Demo {
    public static void main(String[] args) {
        MyThreadRunnalbe mtr = new MyThreadRunnalbe();//創建端口對象(以下3個線程共同使用這1個端口)
        Thread tA = new Thread(mtr, "手機電腦端");// 以該類對象分別實例化4個線程
        Thread tB = new Thread(mtr, "櫃臺");
        Thread tC = new Thread(mtr, "自助售票機");
//        //不可以分別new MyThreadRunnalbe(),3個接口使得3個線程各自執行,無法達到有序的目的
//        Thread tA = new Thread(new MyThreadRunnalbe(), "手機電腦端");
//        Thread tB = new Thread(new MyThreadRunnalbe(), "櫃臺");
//        Thread tC = new Thread(new MyThreadRunnalbe(), "自助售票機");
        tA.start();// 分別啟動線程
        tB.start();
        tC.start();
    }
}

線程的同步(協調)synchronized