Java學者日記 多執行緒(二)

2021-08-21 22:19:34 字數 1726 閱讀 8171

一、前情回顧

在多執行緒(一)中提到,多執行緒的使用是否一定是安全的呢?下面舉乙個例子來分析

該例子是乙個火車票售票系統,由三個視窗售票,用兩種建立多執行緒的方式來執行

①繼承的方式

package thread2;

//模擬火車站售票視窗,開啟三個視窗售票,總票數為100張

class window extends thread else

} }}public class testwindow

}

很明顯,該程式存在著執行緒的安全問題,執行可知。

②實現的方式

package thread2;

//使用實現runnable介面的方式,售票

class window1 implements runnable catch (interruptedexception e) //放大錯誤

system.out.println(thread.currentthread().getname() + "售票,票號為:"

+ ticket--);

} else

} }}public class testwindow1

}

我們應該如何解決這些安全問題呢,下面介紹執行緒的同步機制

二、同步

1.定義:同步是指程式中用於控制不同執行緒間操作發生相對順序的機制

2.同步方式

同步的方式一般分為兩種:①同步**塊 ②同步方法

①同步**塊

synchronized(同步監視器)

*         1.共享資料:多個執行緒共同操作的同乙個資料(變數)

*         2.同步監視器:由乙個類的物件來充當。哪個執行緒獲取此監視器,誰就執行大括號裡被同步的**。俗稱:鎖

*         要求:所有的執行緒必須共用同一把鎖!

class window2 implements runnable  catch (interruptedexception e) 

system.out.println(thread.currentthread().getname()

+ "售票,票號為:" + ticket--);}}

} }}public class testwindow2

}

注:在實現的方式中,考慮同步的話,可以使用this來充當鎖。但是在繼承的方式中,慎用this!

②同步方法

將操作共享資料的方法宣告為synchronized。即此方法為同步方法,能夠保證當其中乙個執行緒執行

此方法時,其它執行緒在外等待直至此執行緒執行完此方法。

同步方法的鎖:this

class window4 implements runnable 

} public synchronized void show() catch (interruptedexception e)

system.out.println(thread.currentthread().getname() + "售票,票號為:" + ticket--);

} }}public class testwindow4

}

執行緒同步的弊端:由於同乙個時間只能有乙個執行緒訪問共享資料,效率變低了。

(部分****於尚矽谷宋紅康老師,在此感謝宋老師)

Java學習日記(6) 多執行緒

多執行緒 執行形式 兩種實現方式及區別 同步及死鎖 實現執行緒的兩種方式 繼承thread類 class 類名稱 extends thread 同步方法 synchronized 方法返回值 方法名稱 引數列表 推薦使用 同步可以保證資源共享的正確性,但過多的同步可能出現死鎖,即程式執行不了了。案例...

java學者日記 介面

介面 介面是抽象方法和常量值的定義的集合。這種技術主要用來描述類具有什麼功能,而並不給出每個功能的具體實現。乙個類可以實現乙個或多個介面,並在需要介面的地方,隨時使用實現了相應介面的物件 下面舉例說明介面的使用 一 介面的定義 inte ce usb 介面的定義注 介面裡的方法預設為 public ...

Java 多執行緒 二

執行緒安全問題 引出同步 塊 通過下面的例子,了解傳統多執行緒存在的執行緒安全隱患。需求 買票 四個視窗同時買票。class ticket implements runnable extends thread catch exception e system.out.println thread.c...