1. 程式人生 > >執行緒死鎖現象和synchronized 用作關鍵字和執行緒另一種建立方式

執行緒死鎖現象和synchronized 用作關鍵字和執行緒另一種建立方式

5月14日java學習筆記

一.執行緒死鎖

1.出現死鎖的條件:

兩個以上執行緒,並且執行緒之間相互需要對方擁有的資源

 public void run()
    {
            if ("傻閨女".equals(Thread.currentThread().getName())) {

                synchronized ("遙控器") {
                    System.out.println("傻閨女拿到了遙控器");

                    synchronized ("電池") {
                        System.out
.println("傻閨女拿到了遙控器和電池,美滋滋的開了空調"); } } } else if("傻兒子".equals(Thread.currentThread().getName())) { synchronized ("電池") { System.out.println("傻兒子拿到了電池"); synchronized ("遙控器") { System.out
.println("傻兒子拿到了遙控器和電池,美滋滋的開了空調"); } } } }

如上方程式碼中如果執行緒一在執行到拿到遙控器時,執行緒二在此時搶奪cpu執行權,拿到電池,則兩個執行緒都被鎖了起來,出現死鎖現象。

2.死鎖現象目前無法解決

二.synchronized作關鍵字

使用synchronized做關鍵詞修飾的函式,已當前執行緒物件(this)在建立時生成的class物件做鎖物件,此鎖物件唯一,可以達到鎖的目的。

三.用Runnable介面

用自定義類implements

Runnable介面,重寫介面中唯一的run()方法,定義一個帶String的構造方法,先建立一個自定義類物件,再建立一個Thread類傳參傳入自定義類物件,新創鍵的Thread物件就是執行緒物件了,這種傳參方式中會在Thread中先判斷傳入物件是否為空,不為空就呼叫自定義物件的run()方法。

相關推薦

執行現象synchronized 用作關鍵字執行建立方式

5月14日java學習筆記 一.執行緒死鎖 1.出現死鎖的條件: 兩個以上執行緒,並且執行緒之間相互需要對方擁有的資源 public void run() { if ("傻閨女".equals(Thread.

Qt 筆記:建立執行方式

class QThread :public Qt { // ....... // ....... protected: virtual void run() = 0; // ....... // ....... }; ps:面向物件程式設計實踐的早起,

java 多執行 valitile關鍵字

死鎖 兩個或者多個執行緒都在等待對方釋放鎖,在寫多執行緒程式碼時要注意避免這種死鎖的發生 發生死鎖後可以在dos命令列輸入jps命令檢視java程序狀況 可以試用jstack -l 程序號   命令檢視當前類的問題 關閉jvm停止死鎖   以上節

執行 現象 遞迴 訊號量 條件定時器 佇列 執行

鎖是用來做什麼的?    保證資料的安全的GIL是幹什麼的?      鎖執行緒有了GIL還要鎖幹啥?      有了GIL還是會出現資料不安全的現象,所以還是要用鎖 import time from threading import Thread,Lock n = 100 def func(lock

day 33 什麼是執行? 兩建立方式. 守護執行. . 現象. 遞迴. GIL

一.執行緒       1.程序:資源的分配單位      執行緒:cpu執行單位(實體)   2.執行緒的建立和銷燬開銷特別小   3.執行緒之間資源共享,共享的是同一個程序中的資源   4.執行緒之間不是隔離的   5.執行緒可不需要 

java學習第十二天之多執行併發

package MoreThreadLearn; /* 兩個儲戶到銀行存錢,每個人存了三次,一次100元 1、描述銀行 2、描述儲戶業務 分析多執行緒是否存在安全隱患? 1、執行緒任務中是否有共享的資料 2、是否多條操作共享資料的程式碼 */ public

執行問題

1、引言   5個哲學家的故事:   5個哲學家去吃飯,菜飯都上齊了,筷子也上了,但是一人只有一隻筷子,每個人,先思考一會,把筷子借給別人,然後,別人吃完了,自己再吃。但是假如這5個人都餓了,他們就會拿起自己的筷子,而筷子只有一隻,大家都在等待這個別人放下那一隻筷子,然後

34-多執行--+執行間通訊+等待喚醒機制+多生產者多消費者問題

一、死鎖 1、死鎖的常見情形之一:同步的巢狀 說明:同步的巢狀,至少得有兩個鎖,且第一個鎖中有第二個鎖,第二個鎖中有第一個鎖。eg:同步程式碼塊中有同步函式,同步函式中有同步程式碼塊。下面的例子,同步程式碼塊的鎖是obj,同步函式的鎖是this。t1執行緒先執行同步程式碼塊,獲取鎖obj,需

Java多執行-47-多執行

       本篇學習什麼是多執行緒死鎖,怎麼避免執行緒死鎖。這個問題,在面試了應該也經常被提到。關於,執行緒死鎖,有這麼一個故事。一個飯桌上,有豐盛的菜餚,圓桌圍著幾個哲學家,問題來了,每個哲學家只有一根筷子。假如必須得到兩根筷子,才

Java開發之執行同步造成的執行

案例解析: 兩個人面對面過獨木橋,甲和乙都已經在橋上走了一段距離,即佔用了橋的資源,甲如果想通過獨木橋的話,乙必須退出橋面讓出橋的資源,讓甲通過,但是乙不服,為什麼讓我先退出去,我還想先過去呢,於是就僵持不下,導致誰也過不了橋,這就是死鎖。 死鎖產生情況解析: 1.互斥條件(

python中的多程序,多執行,,多協程

本人根據自己的理解來總結的,如果有錯誤的地方還請各位大佬指正,謝謝了. 程序:程式是計算機可執行的二進位制資料,只有被作業系統呼叫的時候才開始它們的生命週期.程序就是程式的一次執行,擁有自己的地址空間,記憶體,程序id(pid),資料棧及其他記錄其執行軌跡的輔助資料;最小的

Java筆記-多執行執行問題加簡單舉例

死鎖 導致死鎖的原因 Java中死鎖最簡單的情況是,一個執行緒T1持有鎖L1並且申請獲得鎖L2,而另一個執行緒T2持有鎖L2並且申請獲得鎖L1,因為預設的鎖申請操作都是阻塞的,所以執行緒T1和T2永遠被阻塞了。導致了死鎖。 這是最容易理解也是最簡單的死

執行程式碼

public class DeadLock { //建立兩個物件,一個執行緒持有鎖A並且申請獲得鎖B,而另一個執行緒持有鎖B並且申請獲得鎖A就會發生死鎖。 private static final Object A=new Object(); priv

執行的產生以及如何避免

一、死鎖的定義 多執行緒以及多程序改善了系統資源的利用率並提高了系統 的處理能力。然而,併發執行也帶來了新的問題——死鎖。所謂死鎖是指多個執行緒因競爭資源而造成的一種僵局(互相等待),若無外力作用,這些程序都將無法向前推進。 下面我們通過一些例項來說明死鎖現象。 先看生活中

VC中使用SetThreadName引起的執行

我在工程裡使用以下函式給執行緒設定一個方便除錯的名稱 typedef struct tagTHREADNAME_INFO { DWORD dwType; // must be 0x1000 LPCSTR szName; // poi

.NET Core中遇到奇怪的執行問題:記憶體與執行數不停地增長

一個 asp.net core 站點,之前執行在Linux 伺服器上,執行一段時間後有時站點會掛掉,在日誌中記錄很多“EMFILE too many open files”的錯誤: Microsoft.AspNetCore.Server.Kestrel.Internal.Networking.UvExc

嘗試解決在建構函式中同步呼叫Dns.GetHostAddressesAsync()引起的執行

(最終採用的是方法4) 看看在 Linux 與 Windows 上發生執行緒死鎖的後果。 Linux: Microsoft.AspNetCore.Server.Kestrel.Internal.Networking.UvException: Error -24 EMFILE too many o

《手Q Android執行監控與自動化分析實踐》

一、問題背景 手Q每個版本上線以後研發同學都會收到各種問題反饋。在跟進手Q內部使用者反饋的問題時,發現多例問題,其表象和原因如下: 1、問題表象:“未讀不消失”、“圖片不展示”、“菊花一直在轉” 。。。 2、問題原因:死鎖導致的功能不可用。 這類由死鎖造

VisualVM(9) 排查JAVA應用程式執行

Java虛擬機器效能管理神器 - VisualVM(9) 排查JAVA應用程式執行緒鎖 1. JAVA應用程式執行緒鎖原因 這個例子比較極端,一般情況下,出現鎖競爭激烈是比較常見的。 2. 排查JA

關於GCD執行的一點兒理解

上一篇在總結 GCD 的時候讀到了一篇部落格,提到了這麼一個問題:既然在主佇列(dispatch_get_main_queue)中同步(dispatch_sync())執行一個任務會造成死鎖, - (void)viewDidLoad { [super viewDidLoad]; N