解決執行緒安全的問題:執行緒同步(同步**塊、同步方法、同步鎖)
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 執行緒任務中有多條對共享資料的操作。乙個執行緒在操作共享資料的過程中,其他執行緒參與了運算,造成了資料的錯誤。二 解決思想 只要保證多條操作共享資料的 在某一時間段,被一條執行緒執行,在執行期間不允許其他執行緒參與計算。三 ...