Java 基礎(同步方法解決執行緒安全問題)
阿新 • • 發佈:2021-11-29
同步方法解決執行緒安全問題
如果操作共享資料的程式碼完整的宣告在一個方法中,我們不妨將此方法宣告同步的。
同步方法的總結:
1.同步方法仍然涉及到同步監視器,只是不需要我們顯式的宣告。
2.非靜態的同步方法,同步監視器是:this
靜態的同步方法,同步監視器是:當前類本身
使用實現Runnable介面建立多執行緒
package com.klvchen.java; class Window3 implements Runnable{ private int ticket = 100; boolean isFlag = true; @Override public voidrun() { 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(); } }