線程實現和線程安全性 參考博客:(http://www.importnew.com/20672.html),參考書籍:《Java併發編程實戰》 一、線程Java代碼實現 1.繼承Thread + 聲明Thread的子類 + 運行thread子類的方法 2.創建Thread的匿名子類 3.實現Runn ...
線程實現和線程安全性
參考博客:(http://www.importnew.com/20672.html),參考書籍:《Java併發編程實戰》
一、線程Java代碼實現
1.繼承Thread
- 聲明Thread的子類
public class MyThread extends Thread {
public void run(){
System.out.println("MyThread running");
}
}
- 運行thread子類的方法
MyThread myThread = new MyThread();
myTread.start();
2.創建Thread的匿名子類
Thread thread = new Thread(){
public void run(){
System.out.println("Thread Running");
}
};
thread.start();
3.實現Runnable介面
聲明
public class MyThread implements Runnable { @override public void run() { System.out.println("MyThread is running"); } }
運行
Thread thread = new Thread(new MyRunnable());
thread.start();
4.創建實現Runnable介面的匿名類
new Thread(new Runnable(){
@override
public void run() {
System.out.println("Thread is running");
}
}).start();
5.線程名字
- 創建時候可以給線程起名字
Thread thread = new Thread(new MyRunnable(),"name");
- 獲得名字
Thread thread = new Thread(new MyRunnable(),"name");
System.out.println(thraed.getName());
- 獲取運行當期代碼線程的名字
Thread.currentThread().getName();
二、線程安全性
1.定義
線程會共用進程範圍內的資源,同時,每個線程也會有各自的程式計數器,棧,以及局部變數。在多個線程不完全同步的情況下,多個線程執行的順序是不可預測的,那麼不同的執行順序就可能帶來極其糟糕的結果。
如何定義一個類是線程安全的呢?最核心的問題在於正確性,在代碼中無需進行額外的同步或者協同操作的情況下,無論有多少個線程使用這個類,無論環境以何種方式調度多線程,這個類總能表現出正確的行為,我們就成這個類是線程安全的。
2.線程類不安全的實例
- 1.首先定義Count類,有私有成員count=0;
public class Count {
private long count = 0;
public long getCount() {
return count;
}
public void service() {
count++;
}
}
- 2.然後線上程中去調用這個類的service方法
final Count count = new Count();
for (int i = 0; i < 20000; i++) {
Thread thread3 = new Thread(){
@Override
public void run() {
count.service();
if (count.getCount() == 20000) {
System.out.println("ahha");
}
}
};
thread3.start();
}
3.結果程式卻沒有輸出,說明最後count並沒有達到20000,為什麼呢?
因為存在著以下錯誤執行的情況:線程2線上程1沒有完成count自增的情況下就讀取了count,導致最後count沒有達到20000。
4.併發編程中,這種由於不恰當的執行順序而顯示了不正確結果的情況叫做Race Condition(競爭狀態),這種情況出現的根本原因是count的自增沒有保持原子性。count自增分三步操作,而不是一步到位。