0302 執行緒狀態 執行緒安全

2022-06-07 10:18:10 字數 1893 閱讀 4514

執行緒狀態

1、新建狀態

2、受阻塞狀態

3、執行狀態

4、死亡狀態

5、休眠狀態

6、等待狀態

執行緒安全

當多條執行緒共用乙份資源的時候就睡產生執行緒安全,比如電影院我們有100張票,同時有三個渠道去賣這100張票,看一下案例思維圖

我們來模擬一下這個場景

首先建立乙個執行緒類 實現runnable介面,並且重寫run方法

public class ticket implements runnable catch (interruptedexception e) 

system.out.println(thread.currentthread().getname()+"賣出了第"+num--+"張票");

}} }

}

建立乙個測試類,建立三條執行緒去賣票

public static void main(string args)
根據執行結果會發現,會有第0張和第-1張 還有可能會出現多條執行緒賣同一張票的情況

這就出現了執行緒安全問題,解決這個執行緒安全的方法

1、同步**塊

2、同步方法

3、lock介面

用到的是synchronized關鍵字

1、同步**塊格式

synchronized (鎖物件) catch (interruptedexception e)

system.out.println(thread.currentthread().getname()+"賣出了第"+num--+"張票");}}

} }}

2、同步方法

格式:public synchronized void method()

**展示

public class ticket03 implements runnable

} //同步方法

public synchronized void sale() catch (interruptedexception e)

system.out.println(thread.currentthread().getname()+"賣出了第"+num--+"張票");

} }}

3、lock介面

在loc介面中有兩個方法

(1)lock()獲取鎖

(2)unlock()釋放鎖

因為lock是個介面 那我們需要建立他的子類物件reentrantlock去使用

**展示

public class ticket04 implements runnable catch (interruptedexception e) 

system.out.println(thread.currentthread().getname()+"賣出了第"+num--+"張票");

}//釋放鎖

lock.unlock();

} }}

那我們回想一下stringbuffer和stringbuilder這兩個類完全相同,唯一的區別是stringbuilder比stringbuffer速度要快,是因為stringbuffer底層方法都用了synchronized關鍵字,也就是說stringbuffer類能夠保證執行緒安全,但stringbuilder類是不保證執行緒安全的,所以stringbuilder類適合在單執行緒中使用。

多執行緒 04 執行緒狀態以及執行緒安全

控制線程的狀態 啟動執行緒 void start 進入就緒狀態 執行狀態。當執行緒任務執行完畢,自動進入死亡狀態 阻塞 暫停 執行緒 void sleepuntildate nsdate date void sleepfortimeinterval nstimeinterval ti 進入阻塞狀態 ...

Java執行緒 執行緒狀態

執行緒可以建立6狀態 new 新建立 runnable 可執行 blocked 被阻塞 waiting 等待 timed waiting 計時等待 terminated 被終止 1 新建執行緒 2 可執行執行緒 一旦呼叫start 方法,執行緒就處於runnable狀態,但是卻不必保持執行。執行中的...

執行緒狀態 執行緒池

1.執行緒狀態變遷 2.為什麼notify notifyall wait要在同步方法或塊中執行 2.1在j a中,所有物件都能夠被作為 監視器monitor 指乙個擁有乙個獨佔鎖,乙個入口佇列和乙個等待佇列的實體entity。所有物件的非同步方法都能夠在任意時刻被任意執行緒呼叫,此時不需要考慮加鎖的...