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執行緒筆記
- 多執行緒—賣票執行緒
- Thinking in Java--Java多執行緒學習筆記(1)ThinkingJava執行緒筆記
- Thinking in Java---多執行緒學習筆記(2)ThinkingJava執行緒筆記
- Python學習筆記 - 多執行緒Python筆記執行緒
- Java多執行緒筆記Java執行緒筆記
- Java多執行緒學習筆記(六) 長樂未央篇Java執行緒筆記
- Python學習筆記|Python之執行緒Python筆記執行緒
- Java多執行緒學習(一)Java多執行緒入門Java執行緒
- Java多執行緒學習Java執行緒
- C# 多執行緒學習筆記 – 1C#執行緒筆記
- Java多執行緒學習——執行緒通訊Java執行緒
- Java多執行緒學習(2)執行緒控制Java執行緒
- 【Python3學習筆記】之【Python高階——多執行緒】Python筆記執行緒
- #大學#Java多執行緒學習02(執行緒同步)Java執行緒
- Java 多執行緒NIO學習Java執行緒
- 多執行緒筆記執行緒筆記
- Java多執行緒之執行緒中止Java執行緒
- Java多執行緒學習(3)執行緒同步與執行緒通訊Java執行緒
- 多執行緒賣火車票簡單例子執行緒單例
- java併發筆記之java執行緒模型Java筆記執行緒模型
- Linux程式執行緒學習筆記Linux執行緒筆記
- Java多執行緒之記憶體模型Java執行緒記憶體模型
- (三)Java併發學習筆記–執行緒封閉Java筆記執行緒
- Java多執行緒學習(八)執行緒池與Executor 框架Java執行緒框架
- iOS 多執行緒筆記iOS執行緒筆記
- 多執行緒筆記 一執行緒筆記
- 多執行緒筆記 三執行緒筆記
- 多執行緒筆記 二執行緒筆記
- 多執行緒學習一(多執行緒基礎)執行緒
- Java多執行緒學習(1)建立執行緒與執行緒的生命週期Java執行緒
- Java多執行緒之FutureTaskJava執行緒
- Java多執行緒之CASJava執行緒
- java多執行緒之(synchronized)Java執行緒synchronized
- java多執行緒之執行緒的基本使用Java執行緒
- 【Java】多執行緒複習Java執行緒
- Java併發程式設計學習筆記----執行緒池Java程式設計筆記執行緒
- Java核心技術學習筆記——進階——第五章 Java多執行緒和併發程式設計——5.2 Java多執行緒實現Java筆記執行緒程式設計