1. 程式人生 > 實用技巧 >Java-多執行緒-安全性-同步技術

Java-多執行緒-安全性-同步技術

1、不加同步技術模擬售票例子

package cn.bruce.Thread;

//多執行緒售票案例
//解決安全問題,JAVA程式提供了同步技術synchronized(任意物件){執行緒要操作的共享資料}
//同步程式碼塊
public class MoreThreadDemo2 {
    public static void main(String[] args) {
        // 建立Runnable介面實現類物件
        Tickets t = new Tickets();
        // 建立三個Thread類物件,傳遞Runnable介面實現類
        Thread t0 = new
Thread(t, "視窗1"); Thread t1 = new Thread(t, "視窗2"); Thread t2 = new Thread(t, "視窗3"); // 開啟執行緒 t0.start(); t1.start(); t2.start(); } } class Tickets implements Runnable { private int number = 100; Object object = new Object(); public void
run() { while (true) { //synchronized(object){//同步技術不能使用匿名物件,並且速度會變慢 //對票數做判斷,大於0 可以出售 if (number > 0) { try { Thread.sleep(10);//使用休眠,模擬CPU切換 System.out.println(Thread.currentThread().getName() + "出售第" + number--); }
catch (Exception e) { e.printStackTrace(); } }//} } } }

結果會出現售-1的情況

2、加入同步技術後

package cn.bruce.Thread;

//多執行緒售票案例
//解決安全問題,JAVA程式提供了同步技術synchronized(任意物件){執行緒要操作的共享資料}
//同步程式碼塊
public class MoreThreadDemo2 {
    public static void main(String[] args) {
        // 建立Runnable介面實現類物件
        Tickets t = new Tickets();
        // 建立三個Thread類物件,傳遞Runnable介面實現類
        Thread t0 = new Thread(t, "視窗1");
        Thread t1 = new Thread(t, "視窗2");
        Thread t2 = new Thread(t, "視窗3");
        // 開啟執行緒
        t0.start();
        t1.start();
        t2.start();

    }
}

class Tickets implements Runnable {
    private int number = 100;
    Object object = new Object();

    public void run() {
        while (true)
        {
            synchronized(object){//同步技術不能使用匿名物件,並且速度會變慢
                //對票數做判斷,大於0 可以出售
            if (number > 0)
            {
                try
                {
                    Thread.sleep(10);//使用休眠,模擬CPU切換
                    System.out.println(Thread.currentThread().getName() + "出售第" + number--);
                } catch (Exception e)
                {
                    e.printStackTrace();
                }

            }}
        }
    }

}

不會出現異常資料,但是速度會慢一些