1. 程式人生 > 其它 >Java 基礎(同步方法解決執行緒安全問題)

Java 基礎(同步方法解決執行緒安全問題)

同步方法解決執行緒安全問題

如果操作共享資料的程式碼完整的宣告在一個方法中,我們不妨將此方法宣告同步的。

同步方法的總結:
1.同步方法仍然涉及到同步監視器,只是不需要我們顯式的宣告。
2.非靜態的同步方法,同步監視器是:this
靜態的同步方法,同步監視器是:當前類本身

使用實現Runnable介面建立多執行緒

package com.klvchen.java;

class Window3 implements Runnable{
    private int ticket = 100;

    boolean isFlag = true;

    @Override
    public void
run() { while (isFlag){ show(); } } private synchronized void show(){ //同步監視器:this if (ticket > 0){ try { Thread.sleep(100); }catch (InterruptedException e){ e.printStackTrace(); } System.out.println(Thread.currentThread().getName()
+ ":賣票,票號為:" + ticket); ticket--; }else { isFlag = false; } } } public class WindowTest3 { public static void main(String[] args) { Window3 w = new Window3(); Thread t1 = new Thread(w); Thread t2 = new Thread(w); Thread t3
= new Thread(w); t1.setName("執行緒1"); t2.setName("執行緒2"); t3.setName("執行緒3"); t1.start(); t2.start(); t3.start(); } }

使用繼承Thread類建立多執行緒

package com.klvchen.java;

class Window4 extends Thread{

    private static int ticket = 100;

    private static boolean isFlag = true;

    @Override
    public void run() {
        while (isFlag){
            show();
        }
    }

    private static synchronized void show(){//同步監視器: Window4.class
        //private synchronized void show(){ //同步監視器: t1,t2,t3,此種解決方式不正確
        if (ticket > 0){
            try {
                Thread.sleep(100);
            }catch (InterruptedException e){
                e.printStackTrace();
            }

            System.out.println(Thread.currentThread().getName() + ": 賣票, 票號為: " + ticket);
            ticket--;
        }else {
            isFlag = false;
        }
    }
}

public class WindowTest4 {
    public static void main(String[] args) {
        Window4 t1 = new Window4();
        Window4 t2 = new Window4();
        Window4 t3 = new Window4();

        t1.setName("視窗1");
        t2.setName("視窗2");
        t3.setName("視窗3");

        t1.start();
        t2.start();
        t3.start();
    }
}