我們模擬一個多視窗同時賣票的情景,
問題的關鍵在于兩個人不能賣出相同編號的一張票,
兩個關鍵字:
static 方法和物件一定要是靜態的
synchronized 這個是鎖的關鍵字
我們可以通過兩種方法達到需求:
- 方法鎖
- 物件鎖
方法鎖
方法一:
package com.training.csdn;
/**
* Keafmd
*
* @ClassName: MultiThreadedTicketSelling01
* @Description: 多執行緒賣票方法一
* @author: 牛哄哄的柯南
* @date: 2020-11-24 11:05
*/
public class MultiThreadedTicketSelling01 implements Runnable {
private static int num = 10; // 一定要是static
private String name = "";
public MultiThreadedTicketSelling01(String name) {
this.name = name;
}
@Override
public void run() {
while (num > 0) {
System.out.println(name + "在賣票:" + getTicket());
try {
Thread.sleep(1000); //延遲一下,不然太快看不出來效果
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//方法鎖(方法一)
private synchronized int getTicket() {
return num--;
}
public static void main(String[] args) {
new Thread(new MultiThreadedTicketSelling01("柯南")).start();
new Thread(new MultiThreadedTicketSelling01("小蘭")).start();
}
}
運行結果:
小蘭在賣票:10
柯南在賣票:9
柯南在賣票:7
小蘭在賣票:8
小蘭在賣票:6
柯南在賣票:5
柯南在賣票:4
小蘭在賣票:3
柯南在賣票:2
小蘭在賣票:1
Process finished with exit code 0
物件鎖
方法二:
package com.training.csdn;
/**
* Keafmd
*
* @ClassName: MultiThreadedTicketSelling02
* @Description: 多執行緒賣票方法二
* @author: 牛哄哄的柯南
* @date: 2020-11-24 11:26
*/
public class MultiThreadedTicketSelling02 implements Runnable{
private static int num=10; // 一定要是static
private String name ="";
private static Object obj = new Object(); // 一定要是static
public MultiThreadedTicketSelling02(String name) {
this.name = name;
}
@Override
public void run() {
while(num>0){
System.out.println(name+"在賣票:"+getTicket());
try {
Thread.sleep(1000); //延遲一下,不然太快看不出來效果
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//物件鎖(方法二)
private int getTicket(){
synchronized(obj){
return num--;
}
}
public static void main(String[] args) {
new Thread(new MultiThreadedTicketSelling02("柯南")).start();
new Thread(new MultiThreadedTicketSelling02("小蘭")).start();
}
}
運行結果:
柯南在賣票:10
小蘭在賣票:9
柯南在賣票:8
小蘭在賣票:7
小蘭在賣票:6
柯南在賣票:5
小蘭在賣票:3
柯南在賣票:4
小蘭在賣票:1
柯南在賣票:2
Process finished with exit code 0
在運行結果里,有可能發生3號票比4號票先賣出去,這是正常情況,我們可以將這種情形理解成柯南賣票時剩的有(4,3,2,1)所以柯南打算給顧客4號票,此時系統中4號票已被售出,但是與顧客還沒交易結束,此時小蘭在另外一個視窗賣票,系統中剩的還有(3,2,1)所以小蘭售賣3號票,但是小蘭與顧客交易的快,所以小蘭會先把3號票賣出,只要沒有把一個號賣兩次就是正常的,
讀完如果對你有幫助,感謝點贊支持!
如果你是電腦端,看見右下角的“一鍵三連”了嗎,沒錯點它[哈哈]

加油!
共同努力!
Keafmd
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/227523.html
標籤:java
