package com.iflysse.test05;
/**
* 線程的聲明週期:
新建:當一個Thread類或其子類的對象被聲明並創建時,新生的線程對象處於新建狀態
就緒:新建線程被start()後,將進入線程隊列等待cpu時間片
運行:當就緒線程被調度並獲得處理器資源時,進入運行狀態;
阻塞:某種特殊情況下,被人爲掛起,讓出cpu並臨時中止自己的執行,進入阻塞狀態
死亡:線程完成了它的全部工作,或被提前強制性的中止
- ①線程安全問題存在的原因
由於一個線程在操作共享數據過程中,未執行結束,另外的線程參與進來,導致共享數據存在安全問題
②如何解決線程的安全問題
必須讓一個線程操作共享數據完畢以後,其它線程纔有機會參與共享數據的操作③java如何實現線程安全,線程的同步機制
1)同步代碼塊
synchronized (同步監視器) {
//需要被同步的代碼(即操作共享數據的代碼)
}- ①線程安全問題存在的原因
共享數據:多個線程共同操作的同一個數據(變量)
同步監視器:由任何一個類的對象來充當。那個線程獲取此監視器,誰就執行共享數據鎖必須是唯一的
所有的線程必須公用一把鎖!
注:在實現的方式中,考慮同步的話,可以使用this來當鎖,但在繼承的方式中,慎用!- 2)同步方法
將操作共享數據的方法聲明爲synchronizd,即此方法爲同步方法。
能夠保證當其中一個線程執行此方法時,其他線程在外等待直至此線程執行完此方法。
同步方法的鎖:當前對象(this)
*- 2)同步方法
- 小結:釋放鎖的操作
*
- sleep();不釋放鎖
- 死鎖的問題
不同的線程分別佔用對方所需要的同步資源不放棄,都在等待對方放棄自己需要的同步資源,就形成了線程的死鎖
如何解決
減少同步資源的定義
*/
public class Day032805 {
public static void main(String[] args) {
final StringBuffer sb1 = new StringBuffer("");
final StringBuffer sb2 = new StringBuffer("");
//定義兩個線程 1 2
//A先獲取鎖sb1 插入數據 再獲取所sb2 打印數據
//B先獲取所sb2 再獲取所sb1
//定義線程1
//匿名類匿名對象 1
new Thread(){
public void run(){
synchronized (sb1) {
sb1.append("A");
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized (sb2) {
sb2.append("B");
System.out.println("==================");
System.out.println(sb1);
System.out.println(sb2);
System.out.println("==================");
}
}
}
}.start();
//線程2
new Thread(){
public void run(){
synchronized (sb2) {
sb1.append("C");
try {
Thread.currentThread().sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized (sb1) {
sb2.append("D");
System.out.println("**********************");
System.out.println(sb1);
System.out.println(sb2);
System.out.println("**********************");
}
}
}
}.start();
}
}