JAVA學習筆記之 多執行緒賣票
多執行緒程式出現安全問題的原因:
A:是多執行緒程式。
B:有共享資料。
C:針對共享資料有多條語句操作。現在的程式存在著問題,所以,我們要改進該程式,讓它沒有問題。
怎麼改進呢?
只需要把多執行緒環境中,操作共享資料的操作給變成單執行緒的就沒有問題了。-
Java針對這種情況,就提供了同步技術:同步程式碼塊。
格式:
synchronized(物件) {
需要被同步的程式碼。
}A:物件? 如果不知道用哪個物件,就用Object物件。 B:需要被同步的程式碼? 哪些程式碼導致出現了問題,就把哪些程式碼給同步起來。 哪些程式碼會出問題呢? 有共享資料。 針對共享資料有多條語句操作。
加入同步後,居然還有問題,為什麼呢?
同步程式碼塊中的物件針對多個執行緒必須是同一個。
其實這個物件被稱為同步鎖物件。同步程式碼塊的鎖物件是誰?
任意物件同步方法的鎖物件是誰?
this物件靜態方法的鎖物件是誰?
類.class 位元組碼檔案物件
當前類的位元組碼檔案程式碼如下
public static void main(String[] args) {
Ticket t = new Ticket();
Thread t1 = new Thread(t, "視窗1");
Thread t2 = new Thread(t, "視窗2");
Thread t3 = new Thread(t, "視窗3");
Thread t4 = new Thread(t, "視窗4");
t1.start();
t2.start();
t3.start();
t4.start();
}
Ticket的類 ----- 同步鎖
public class Ticket implements Runnable {
private int tickets = 100;
private Object obj = new Object();
@Override
public void run() {
while (true) {
// t1,t2,t3,t4
// tickets=1;
// 假設t1過來,看到synchronized,就知道下面的程式碼被同步了。
// 看到obj就知道這是鎖物件。假設t1進去前,obj這個鎖物件表示開的狀態。
synchronized (obj) {
// t1進來,就把鎖物件的狀態改為關的狀態。
if (tickets > 0) {
try {
Thread.sleep(10);// t1睡下了
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+ "正在出售第" + (tickets--) + "張票");
}
}
// t1出來了,你們繼續搶,我也還可以搶。
}
}
}
Ticket的類 ----- Lock鎖
public class Ticket implements Runnable {
public int ticks = 100;
//定義lock鎖物件
private Lock lock = new ReentrantLock();
@Override
public void run() {
lock.lock();
if (ticks > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "正在出售第" + (ticks--) + "張票");
}
//釋放鎖
lock.unlock();
}
}
相關文章
- 多執行緒—賣票執行緒
- Java 多執行緒學習筆記Java執行緒筆記
- java學習筆記--多執行緒Java筆記執行緒
- Java學習筆記之執行緒Java筆記執行緒
- Java多執行緒學習筆記(自用)Java執行緒筆記
- Java 多執行緒學習筆記(三)-守護執行緒Java執行緒筆記
- Java多執行緒之併發安全經典案例-賣票Java執行緒
- Java多執行緒學習筆記(二) (轉)Java執行緒筆記
- 多執行緒學習筆記執行緒筆記
- 多執行緒學習筆記 (轉)執行緒筆記
- Thinking in Java--Java多執行緒學習筆記(1)ThinkingJava執行緒筆記
- Java 多執行緒 學習筆記(二)停止執行緒的幾種方法Java執行緒筆記
- Thinking in Java---多執行緒學習筆記(2)ThinkingJava執行緒筆記
- Java 多執行緒學習筆記(四)yield 介紹Java執行緒筆記
- Java 多執行緒學習筆記(五)synchronized 鎖重入Java執行緒筆記synchronized
- Java多執行緒筆記Java執行緒筆記
- Python學習筆記 - 多執行緒Python筆記執行緒
- C#多執行緒學習筆記C#執行緒筆記
- Java多執行緒學習筆記(六) 長樂未央篇Java執行緒筆記
- 多執行緒賣火車票簡單例子執行緒單例
- 利用多執行緒寫一個賣票程式執行緒
- java學習筆記.04——執行緒池Java筆記執行緒
- Java多執行緒學習Java執行緒
- Java多執行緒學習(一)Java多執行緒入門Java執行緒
- C# 多執行緒學習筆記 – 1C#執行緒筆記
- Java多執行緒學習——執行緒通訊Java執行緒
- Java多執行緒學習(2)執行緒控制Java執行緒
- Java學習之併發多執行緒理解Java執行緒
- Java 多執行緒NIO學習Java執行緒
- Java多執行緒(學習篇)Java執行緒
- 執行緒鎖 -賣票機制執行緒
- #大學#Java多執行緒學習02(執行緒同步)Java執行緒
- iOS執行緒學習筆記iOS執行緒筆記
- Java多執行緒之join()的使用初學習Java執行緒
- 多執行緒筆記執行緒筆記
- Python學習筆記|Python之執行緒Python筆記執行緒
- java多執行緒學習小案例Java執行緒
- Java多執行緒之執行緒中止Java執行緒