需求:某車站出售舟山至寧波的車票,共一百張,有三個視窗賣票,請設計一個程式模擬視窗賣票
分析:
1.定義一個SellTicket類實作Runnable介面,并重寫run方法,并定義車票總張數
2.在run方法中判斷票是否大于0;
是:賣票,并告知哪個視窗賣出的,賣票后總票數減一
否:提示沒票了
3.定義一個測驗類,創建SellTicket類物件,并作為引數創建三個Thread類物件,賦予執行緒名
4.啟動執行緒
SellTicket類
public class SellTicket implements Runnable{
//定義總張數
private int tickets=100;
@Override
public void run() {
while (true) {
//判斷車票是否大于0
if (tickets > 0) {
System.out.println(Thread.currentThread().getName() + "賣出第" + tickets + "張車票");
tickets--;
}
?
}
}
}
SellTicketDemo類
public class SellTicketDemo {
public static void main(String[] args) {
//創建SellTicket類物件
SellTicket st=new SellTicket();
//作為引數創建三個Thread類物件,賦予執行緒名
Thread t=new Thread(st,"視窗一");
Thread t1=new Thread(st,"視窗二");
Thread t2=new Thread(st,"視窗三");
//啟動執行緒
t.start();
t1.start();
t2.start();
}
}
經過運行發現會出現兩個問題:
1.三個執行緒賣出了相同號碼的車票
2.賣出了負數的車票
導致兩個問題出現的原因是執行緒的隨機性導致的資料安全問題,
一、那么如何判斷多執行緒程式是否有資料安全問題?
1.判斷程式是否是多執行緒環境
2.判斷程式是否有共享資料
3.判斷程式是否有多條陳述句操作共享資料
二、如何解決多執行緒安全問題?
1.基本思想:讓程式沒有安全問題的環境
2.把多條陳述句操作共享資料的代碼塊鎖起來,讓任意時刻只能有一個執行緒執行
這里使用同步代碼塊的方式來解決
三、同步代碼塊
格式:
synchronized(任意物件){
多條陳述句操作共享資料的代碼;
}
synchronized(任意物件):就相當于給代碼加鎖了,任意物件就可以看作是一把鎖
修改后SellTicket類
import static java.lang.Thread.sleep;
?
public class SellTicket implements Runnable{
//定義總張數
private int tickets=100;
//定義一把鎖
private Object obj=new Object();
@Override
public void run() {
synchronized (obj){
while (true) {
//判斷車票是否大于0
if (tickets > 0) {
System.out.println(Thread.currentThread().getName() + "賣出第" + tickets + "張車票");
tickets--;
//模仿出票
try {
sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
?
}
}
}
這樣就解決了以上兩個問題,
四、同步代碼塊的優缺點
1.優點:解決了多執行緒的資料安全問題
2.缺點:當執行緒很多時,因為每個執行緒都會去判斷同步代碼塊中的鎖,很耗費資源,會降低程式的運行效率
五、同步方法
1.同步方法就是把synchronized關鍵字加在方法上
格式:
修飾符synchronized 回傳值型別 方法名(方法引數){}
public synchronized void sellTiket(){}
同步方法的鎖物件是 this
synchronized (this)
2.同步靜態方法就是把synchronized關鍵字加在靜態方法上
格式:
修飾符 static synchronized 回傳值型別 方法名(方法引數){}
public static synchronized void sellTiket(){}
同步方法的鎖物件是類名.class
synchronized (SellTicket.class)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/458226.html
標籤:其他
