Java多線(xiàn)程模擬售票程序和線(xiàn)程安全問(wèn)題
Java中線(xiàn)程部分知識(shí)中,售票程序非常經(jīng)典。程序中也有一些問(wèn)題存在!
需求:模擬3個(gè)窗口同時(shí)在售100張票。
問(wèn)題1:為什么100張票被賣(mài)出了300張票?
原因:因?yàn)閠ickets是非靜態(tài)的,非靜態(tài)的成員變量數(shù)據(jù)是在每個(gè)對(duì)象中都會(huì)維護(hù)一份數(shù)據(jù)的,三個(gè)線(xiàn)程對(duì)象就會(huì)有三份。
解決方案:把tickets票數(shù)共享出來(lái)給三個(gè)線(xiàn)程對(duì)象使用。使用static修飾。
問(wèn)題2: 出現(xiàn)了線(xiàn)程安全問(wèn)題 ?
線(xiàn)程安全問(wèn)題的解決方案:sun提供了線(xiàn)程同步機(jī)制讓我們解決這類(lèi)問(wèn)題的。
java線(xiàn)程同步機(jī)制的方式:
方式一:同步代碼塊
方式二:同步函數(shù)
class SellTickets extends Thread{
static int tickets=1;//票數(shù) 這里 必須定義為static。不然 非靜態(tài)的成員變量,非靜態(tài)的成員變量數(shù)據(jù)是在每個(gè)對(duì)象中都會(huì)維護(hù)一份數(shù)據(jù)的。三個(gè)線(xiàn)程對(duì)象就會(huì)有三份。
public SellTickets(String threadName) {
super(threadName);
}
public void run() {
while(true){
synchronized ("鎖") {
if(tickets==101){//或者 if(tickets>100){
System.out.println("票已經(jīng)賣(mài)完啦-_-...");
break;
}
System.out.println(Thread.currentThread().getName()+"賣(mài)了第"+tickets+"號(hào)票");
tickets++;
/*
if(tickets==101){ //錯(cuò)誤的。當(dāng)ticket==101時(shí),只跳出一個(gè)線(xiàn)程。其它兩個(gè)線(xiàn)程還存在tickets++。
break;
}
/*
if(Thread.currentThread().getName().equals("窗口2")){ //窗口2最多只能賣(mài)一張票,就結(jié)束了
break;
}
*/
}
//System.out.println(Thread.currentThread().getName()+"鎖后...");
}
}
}
public class Demo4 {
public static void main(String[] args) {
//創(chuàng)建三個(gè)線(xiàn)程對(duì)象,模擬三個(gè)窗口
SellTickets s1=new SellTickets("窗口1");
SellTickets s2=new SellTickets("窗口2");
SellTickets s3=new SellTickets("窗口3");
//開(kāi)啟線(xiàn)程售票
s1.start();
s2.start();
s3.start();
System.out.println("main方法...");
}
}
- java多線(xiàn)程之線(xiàn)程安全的單例模式
- Java多線(xiàn)程編程安全退出線(xiàn)程方法介紹
- Java多線(xiàn)程之CAS算法實(shí)現(xiàn)線(xiàn)程安全
- Java多線(xiàn)程環(huán)境下SimpleDateFormat類(lèi)安全轉(zhuǎn)換
- Java多線(xiàn)程及線(xiàn)程安全實(shí)現(xiàn)方法解析
- Java多線(xiàn)程下解決數(shù)據(jù)安全問(wèn)題
- 聊聊java多線(xiàn)程創(chuàng)建方式及線(xiàn)程安全問(wèn)題
- Java多線(xiàn)程之線(xiàn)程安全問(wèn)題詳情
相關(guān)文章
mybatis的動(dòng)態(tài)SQL和模糊查詢(xún)實(shí)例詳解
這篇文章主要給大家介紹了關(guān)于mybatis的動(dòng)態(tài)SQL和模糊查詢(xún)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
maven加載依賴(lài)報(bào)錯(cuò)的原因分析及解決方法
通常我們?cè)陧?xiàng)目中引入第三方依賴(lài)包時(shí),為了避免其版本迭代問(wèn)題,經(jīng)常會(huì)使用本地的包,這篇文章主要給大家介紹了關(guān)于maven加載依賴(lài)報(bào)錯(cuò)的原因分析及解決方法的相關(guān)資料,需要的朋友可以參考下2023-10-10
Java拷貝數(shù)組方法Arrays.copyOf()是地址傳遞的證明實(shí)例
今天小編就為大家分享一篇關(guān)于Java拷貝數(shù)組方法Arrays.copyOf()是地址傳遞的證明實(shí)例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10
SpringBoot?熱搜與不雅文字過(guò)濾的實(shí)現(xiàn)
本文主要介紹了SpringBoot?熱搜與不雅文字過(guò)濾的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
java 通過(guò)cmd 調(diào)用命令啟動(dòng)tomcat的操作
這篇文章主要介紹了java 通過(guò)cmd 調(diào)用命令啟動(dòng)tomcat的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11

