多執行緒與執行緒安全2

2021-10-08 08:54:12 字數 3279 閱讀 8014

1、例子:用兩個執行緒,交替列印1-100的數字

public class main 

}class number implements runnableelse

try catch (interruptedexception e) }}

}}

涉及到的三個方法:wait():一旦執行到此處,當前執行緒就進入阻塞狀態,並且釋放同步監視器。

notify():一旦執行到此處,就會喚醒被wait的乙個執行緒,如果有多個,釋放優先順序高的。

notifyall():一旦執行到此處,就會喚醒被wait的所有執行緒

注意:

這個三個方法必須要使用在同步方法或者同步**塊中。

這個三個方法的呼叫者,是同步監視器。

這個三個方法是定義在object中的,因為同步監視器可以是任何乙個類的物件。

2、sleep()和wait()的異同

相同:一旦執行方法當前執行緒就會被阻塞

不同:兩個方法宣告的位置不同:thread類中宣告sleep,object類中宣告wait

呼叫的要求不同:sleep可以在任何需要的條件下呼叫,wait必須要使用在同步方法或者同步**塊中

是否釋放同步監視器:如果都在同步方法或者同步**塊中,wait會釋放鎖,sleep不會

3、執行緒通訊的應用:生產者/消費者問題

生產者(productor)將產品交給店員(clerk),而消費者(customer)從店員處,取走產品,店員一次只能持有固定數量的產品,如果生產者試圖生產更多的產品,店員會叫停。如果店員沒用足夠的產品,會讓消費者等一下。

class clerkelse catch (interruptedexception e) }}

//消費產品

public synchronized void consumeproduct() else catch (interruptedexception e) }}

}class productor extends thread

@override

public void run()

}}class customer extends thread

@override

public void run()

}}public class main

}

1、實現callable介面與runnable相比,更強大。

相比run()方法有可以有返回值。

可以丟擲異常,

支援泛型的返回值

需要借助futuretask類(future介面可以對runnable、callable任務執行的結果進行取消、查詢是否完成、獲取結果等。futuretask是future介面的唯一實現類,futuretask同時實現了runnable、future介面。)

//建立乙個callable介面的實現類

class numthread implements callable

}return sum;

}}public class main catch (interruptedexception e) catch (executionexception e) }}

2、使用執行緒池背景:經常建立和銷毀、使用量特別大的資源,比如併發情況下的執行緒,對效能影響很大。

思路:提前建立好多個執行緒,放入執行緒池中,使用直接獲取,使用完放回池中。類似生活中的交通工具

}快取執行緒池:(長度無限制)1、判斷執行緒池是否存在空閒的執行緒

2、存在則使用

4、不存在,則建立執行緒,放入執行緒池中,然後使用

public class main 

});service.execute(new runnable()

});service.execute(new runnable()

});//這時緩衝池有是三個執行緒

thread.sleep(1000);

//會使用上面三個執行緒池中的乙個來執行任務

service.execute(new runnable()

});}}

定長線程池:(長度是指定的)1、判斷執行緒池是否存在空閒的執行緒

2、存在則使用

4、不存在,且執行緒池未滿的情況下,建立,否則就會等待。

public class main  catch (interruptedexception e) 

}});

service.execute(new runnable() catch (interruptedexception e)

}});

//過了三秒才會執行

service.execute(new runnable()

});}}

單執行緒執行緒池:1、判斷執行緒池是否存在空閒的執行緒

2、存在則使用

4、不存在則等待,等那個單執行緒空閒後使用

public class main 

});service.execute(new runnable()

});service.execute(new runnable()

});}}

週期任務 定長線程池:在定長線程池的基礎上,定時執行,當某個時機觸發時,自動執行某任務

public class main 

}, 3, timeunit.seconds);

/*** 週期執行任務

* 引數1:任務

* 引數2:延遲時長數字(第一次執行在什麼時間以後)

* 引數2:週期時長數字(每隔多久執行)

* 引數3:時長數字的時間單位

*/service.scheduleatfixedrate(new runnable()

}, 3, 1, timeunit.seconds);

}}

多執行緒 執行緒安全

原因 當多個執行緒同時共享,同乙個全域性變數或靜態變數。做寫的操作時,可能發生資料衝突問題,也就是執行緒安全問題。但是做讀操作是不會發生資料衝突問題。解決方案 方式一 內建鎖synchronized synchronized保證執行緒原子性,當執行緒進入方法的時候,自動獲取鎖,一旦鎖被其它執行緒獲取...

多執行緒 執行緒安全

public class unsafethread t.start while thread.activecount 1 system.out.println sum 1 從主記憶體中講sum變數複製到執行緒的工作記憶體 2 在工作記憶體中修改變數 1操作 3 將sum變數從執行緒的工作記憶體寫回到...

多執行緒 執行緒安全

執行緒安全 多個執行流對臨界資源的爭搶訪問,但是不會出現資料二義性 執行緒安全的實現 同步 通過條件判斷保證對臨界資源訪問的合理性 互斥 通過同一時間對臨界資源訪問的唯一性實現臨界資源訪問的安全性 互斥鎖實現的原理 互斥鎖本身是乙個只有0 1的計數器,描述了乙個臨界資源當前的訪問狀態,所有執行流在訪...