Java多線程模擬售票程序和線程安全問題
Java中線程部分知識中,售票程序非常經(jīng)典。程序中也有一些問題存在!
需求:模擬3個窗口同時在售100張票。
問題1:為什么100張票被賣出了300張票?
原因:因為tickets是非靜態(tài)的,非靜態(tài)的成員變量數(shù)據(jù)是在每個對象中都會維護(hù)一份數(shù)據(jù)的,三個線程對象就會有三份。
解決方案:把tickets票數(shù)共享出來給三個線程對象使用。使用static修飾。
問題2: 出現(xiàn)了線程安全問題 ?
線程安全問題的解決方案:sun提供了線程同步機制讓我們解決這類問題的。
java線程同步機制的方式:
方式一:同步代碼塊
方式二:同步函數(shù)
class SellTickets extends Thread{
static int tickets=1;//票數(shù) 這里 必須定義為static。不然 非靜態(tài)的成員變量,非靜態(tài)的成員變量數(shù)據(jù)是在每個對象中都會維護(hù)一份數(shù)據(jù)的。三個線程對象就會有三份。
public SellTickets(String threadName) {
super(threadName);
}
public void run() {
while(true){
synchronized ("鎖") {
if(tickets==101){//或者 if(tickets>100){
System.out.println("票已經(jīng)賣完啦-_-...");
break;
}
System.out.println(Thread.currentThread().getName()+"賣了第"+tickets+"號票");
tickets++;
/*
if(tickets==101){ //錯誤的。當(dāng)ticket==101時,只跳出一個線程。其它兩個線程還存在tickets++。
break;
}
/*
if(Thread.currentThread().getName().equals("窗口2")){ //窗口2最多只能賣一張票,就結(jié)束了
break;
}
*/
}
//System.out.println(Thread.currentThread().getName()+"鎖后...");
}
}
}
public class Demo4 {
public static void main(String[] args) {
//創(chuàng)建三個線程對象,模擬三個窗口
SellTickets s1=new SellTickets("窗口1");
SellTickets s2=new SellTickets("窗口2");
SellTickets s3=new SellTickets("窗口3");
//開啟線程售票
s1.start();
s2.start();
s3.start();
System.out.println("main方法...");
}
}
相關(guān)文章
Java拷貝數(shù)組方法Arrays.copyOf()是地址傳遞的證明實例
今天小編就為大家分享一篇關(guān)于Java拷貝數(shù)組方法Arrays.copyOf()是地址傳遞的證明實例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-10-10
java 通過cmd 調(diào)用命令啟動tomcat的操作
這篇文章主要介紹了java 通過cmd 調(diào)用命令啟動tomcat的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11

