執行緒共享資料的安全問題和死鎖問題

2021-08-20 08:21:06 字數 4307 閱讀 8219

解決執行緒安全的問題:執行緒同步(同步**塊、同步方法、同步鎖)

1.同步**塊

synchronized(同步監視器)

同步監視器 : 俗稱「鎖」。可以使用任何物件充當。但是必須確定多個執行緒持有同一把鎖(同乙個物件)

2.同步方法

同步方法: ---- 隱式的鎖 : this

----如果同步方法被靜態(static)修飾後,隱式的鎖是該類所屬的位元組碼檔案***.class(因為被static修飾,沒有物件可呼叫此方法)

public synchronized void show()

3.同步鎖

public class myrunnable implements runnable  catch (interruptedexception e) 

tick--;

system.out.println(thread.currentthread().getname() + "完成售票,餘票為 :" + tick);

}} finally

} }}

public class testlock 

}

public class testthreaddeadlock 

}

列印結果

aa完成售票,餘票為 :99

aa完成售票,餘票為 :98

bb完成售票,餘票為 :97

bb完成售票,餘票為 :96

aa完成售票,餘票為 :95

aa完成售票,餘票為 :94

aa完成售票,餘票為 :93

aa完成售票,餘票為 :92

bb完成售票,餘票為 :91

aa完成售票,餘票為 :90

bb完成售票,餘票為 :89

aa完成售票,餘票為 :88

bb完成售票,餘票為 :87

bb完成售票,餘票為 :86

bb完成售票,餘票為 :85

bb完成售票,餘票為 :84

aa完成售票,餘票為 :83

aa完成售票,餘票為 :82

bb完成售票,餘票為 :81

bb完成售票,餘票為 :80

bb完成售票,餘票為 :79

bb完成售票,餘票為 :78

bb完成售票,餘票為 :77

bb完成售票,餘票為 :76

aa完成售票,餘票為 :75

aa完成售票,餘票為 :74

aa完成售票,餘票為 :73

aa完成售票,餘票為 :72

aa完成售票,餘票為 :71

aa完成售票,餘票為 :70

aa完成售票,餘票為 :69

aa完成售票,餘票為 :68

aa完成售票,餘票為 :67

aa完成售票,餘票為 :66

aa完成售票,餘票為 :65

aa完成售票,餘票為 :64

aa完成售票,餘票為 :63

aa完成售票,餘票為 :62

aa完成售票,餘票為 :61

aa完成售票,餘票為 :60

aa完成售票,餘票為 :59

aa完成售票,餘票為 :58

aa完成售票,餘票為 :57

bb完成售票,餘票為 :56

bb完成售票,餘票為 :55

bb完成售票,餘票為 :54

bb完成售票,餘票為 :53

bb完成售票,餘票為 :52

bb完成售票,餘票為 :51

bb完成售票,餘票為 :50

bb完成售票,餘票為 :49

bb完成售票,餘票為 :48

bb完成售票,餘票為 :47

bb完成售票,餘票為 :46

bb完成售票,餘票為 :45

bb完成售票,餘票為 :44

bb完成售票,餘票為 :43

bb完成售票,餘票為 :42

bb完成售票,餘票為 :41

bb完成售票,餘票為 :40

bb完成售票,餘票為 :39

bb完成售票,餘票為 :38

bb完成售票,餘票為 :37

bb完成售票,餘票為 :36

bb完成售票,餘票為 :35

bb完成售票,餘票為 :34

aa完成售票,餘票為 :33

aa完成售票,餘票為 :32

aa完成售票,餘票為 :31

aa完成售票,餘票為 :30

aa完成售票,餘票為 :29

aa完成售票,餘票為 :28

bb完成售票,餘票為 :27

bb完成售票,餘票為 :26

bb完成售票,餘票為 :25

bb完成售票,餘票為 :24

bb完成售票,餘票為 :23

aa完成售票,餘票為 :22

aa完成售票,餘票為 :21

aa完成售票,餘票為 :20

aa完成售票,餘票為 :19

aa完成售票,餘票為 :18

aa完成售票,餘票為 :17

aa完成售票,餘票為 :16

aa完成售票,餘票為 :15

aa完成售票,餘票為 :14

aa完成售票,餘票為 :13

aa完成售票,餘票為 :12

aa完成售票,餘票為 :11

aa完成售票,餘票為 :10

aa完成售票,餘票為 :9

aa完成售票,餘票為 :8

aa完成售票,餘票為 :7

aa完成售票,餘票為 :6

aa完成售票,餘票為 :5

aa完成售票,餘票為 :4

bb完成售票,餘票為 :3

bb完成售票,餘票為 :2

bb完成售票,餘票為 :1

bb完成售票,餘票為 :0

4.讀寫分離鎖:reentrantreadwritelock(讀讀共享、寫寫互斥、讀寫互斥)

public class usereentrantreadwritelock  catch (exception e)  finally 	}	

public void write() catch (exception e) finally }

public static void main(string args)

}, "t1");

thread t2 = new thread(new runnable()

}, "t2");

thread t3 = new thread(new runnable()

}, "t3");

thread t4 = new thread(new runnable()

}, "t4");

// t1.start();

// t2.start();

// t1.start(); // r

// t3.start(); // w

t3.start();

t4.start();

}}

執行緒的死鎖 : 不同的執行緒分別占用對方需要的同步資源不放棄,都在等待對方放棄自己需要的同步資源,就形成了執行緒的死鎖

匿名內部類寫乙個死鎖

public class testthreaddeadlock  catch (interruptedexception e) 

synchronized (obj2) }}

}.start();

// thread.sleep(5000);

//執行緒2

new thread() }}

}.start();

}}

獲取資源1,等待資源2......

獲取資源2,等待資源1......

**寫乙個死鎖

public class myrunnable implements runnable  catch (interruptedexception e) 

synchronized (obj2)

}}else

}} }

}

public class testthreaddeadlock 

}

獲取資源1,等待資源2......

獲取資源2,等待資源1......

printf和cout的執行緒安全問題

總結一下csdn上面的乙個帖子。cql23 提出乙個問題,請看下面的例子。include include using namespace std const unsigned int size 10 const unsigned int pcount 3 const unsigned int cco...

多執行緒的安全問題

首先先提出幾個問題 1.多執行緒程式設計何時會出現執行緒不安全的問題?2.如何解決執行緒不安全的問題?執行緒不安全的本質是多執行緒共享資料,那麼什麼情況下多執行緒會共享資料?無外乎這麼幾種情況 1 多執行緒訪問單例項中的例項變數 2 多執行緒訪問靜態變數 下面將舉例說明,這個例子模擬鐵路售票系統,實...

多執行緒的安全問題

需要同步操作共享資料的 塊 一 產生的原因 1 執行緒任務中有共享資料 2 執行緒任務中有多條對共享資料的操作。乙個執行緒在操作共享資料的過程中,其他執行緒參與了運算,造成了資料的錯誤。二 解決思想 只要保證多條操作共享資料的 在某一時間段,被一條執行緒執行,在執行期間不允許其他執行緒參與計算。三 ...