我們先看個錯誤示例。**功能:宣告乙個數字並賦值10000.然後讓1w個執行緒去減少1,1w個執行緒去增加1。理論上說,加一萬減一萬,最後數字的結果並不會改變。
**:
classerrordemo
};t1.start();
reduce[i]=t1;
}//建立1w個增加執行緒
for(int i=0;i)
};t2.start();
add[i]=t2;
}//讓主線程等待所有執行緒執行完畢
for(thread t:add)
for(thread t:reduce)
//輸出結果
system.out.println(num);
}}
最後輸出的結果是9999。這個結果不固定,有多有少。
造成這種錯誤的原因是:
假設增加執行緒獲取到數字是10000,進行了加一操作,結果是10001。
但是減少執行緒在返回結果之前也獲取到了數字10000。
減少執行緒最後返回9999。
所以我們原本期望得到的10000變成了9999。
為了解決這種問題,可以使用synchronized
使用方法:
object object=newobject();//object就是你當前執行緒操作的物件,比如上面的int數字
synchronized
(object)
釋放object的方法:
synchronized**塊結束或者異常丟擲。使用synchronized後的**
publicclass
thread_synchronization
class
errordemo}};
t1.start();
reduce[i]=t1;
}//建立1w個增加執行緒
for(int i=0;i)}};
t2.start();
add[i]=t2;
}//讓主線程等待所有執行緒執行完畢
for(thread t:add)
for(thread t:reduce)
//輸出結果
system.out.println(num);
}public
static
int addnum(int
num)
public
static
int reducenum(int
num)
}
最後的結果是10000
除了上面的方法,還可以直接在運算元據的方法前加上synchronized
publicclass
thread_synchronization
class
errordemo
};t1.start();
reduce[i]=t1;
}//建立1w個增加執行緒
for(int i=0;i)
};t2.start();
add[i]=t2;
}//讓主線程等待所有執行緒執行完畢
for(thread t:add)
for(thread t:reduce)
//輸出結果
system.out.println(num);
}public
synchronized
static
int addnum(int
num)
public
synchronized
static
int reducenum(int
num)
}
最後的結果是10000
如果乙個類裡面的所有方法都被synchronized修飾,那麼這個類就是執行緒安全的類。
同一時間,只有乙個執行緒可以進入這個類的乙個例項去修改資料,以免多個執行緒同時修改資料,而產生髒資料。
多執行緒同步問題
在應用程式中使用多個執行緒的乙個好處是每個執行緒都可以非同步執行。對於 windows 應用程式,耗時的任務可以在後台執行,而使應用程式視窗和控制項保持響應。對於伺服器應用程式,多執行緒處理提供了用不同執行緒處理每個傳入請求的能力。否則,在完全滿足前乙個請求之前,將無法處理每個新請求。然而,執行緒的...
多執行緒同步問題
有四個執行緒1,2,3,4,執行緒1的功能就是輸出1,執行緒2的功能就是輸出2,以此類推.現在有四個檔案.abcd.初始都為空.現要讓四個檔案呈如下格式 a 1 2 3 4 1 2.b 2 3 4 1 2 3.c 3 4 1 2 3 4.d 4 1 2 3 4 1.設計程式.include sys ...
多執行緒 同步問題
我們先看個錯誤示例。功能 宣告乙個數字並賦值10000.然後讓1w個執行緒去減少1,1w個執行緒去增加1。理論上說,加一萬減一萬,最後數字的結果並不會改變。class errordemo 釋放object的方法 synchronized 塊結束或者異常丟擲。使用synchronized後的 publ...