Java 多執行緒 二

2021-06-23 00:46:24 字數 1969 閱讀 1256

執行緒安全問題--引出同步**塊

通過下面的例子,了解傳統多執行緒存在的執行緒安全隱患。

/*

需求:買票;

四個視窗同時買票。

*/class ticket implements runnable//extends thread

catch (exception e) {}

*/system.out.println(thread.currentthread().getname()+"...sale..."+num--);}}

}public class threadproblems

}

一開始,使用被注釋的**執行,**執行會出現如下的結果(這只是結果的一種,因為,多執行緒的結果不固定):

thread-3...sale...3

thread-0...sale...2

thread-1...sale...1

thread-2...sale...0

thread-3...sale...-1

thread-0...sale...-2

會看到出現了0、-1、-2的結果,票數出現了小於等於零的現象,這就是執行緒不夠安全的表現。

原因:由於cpu切換執行緒是隨機的,有可能會導致某乙個執行緒進入共享資料判斷和處理模組並剝奪其控制權,使其進入等待佇列;而切換到

另乙個執行緒中。從而導致對共享資料處理的問題,產生執行緒安全問題。

執行緒安全產生的原因:

1、多個執行緒在操作共享的資料。

2、操作共享資料的執行緒**有多條。

當乙個執行緒在執行操作共享資料的多條**過程中,其他執行緒參與了運

算。就會導致執行緒安全問題的產生。

解決思路:

就是將多條操作共享資料的執行緒**封裝起來,當有執行緒在執行這些**的

時候,其他執行緒不可以參與運算。

必須要當前執行緒把這些**都執行完畢後,其他執行緒才可以參與運算。

這時就引入了同步**塊的概念:

封裝的方法:

使用synchronized同步關鍵字,封裝**。

synchronized(物件)

物件:相當於乙個標記、標誌鎖。

將上面的例子改為:

class ticket implements runnable//extends thread}}	

}

為什麼要在synchronize的後面引入乙個物件引數?

這個物件具有鎖的特徵。確保在同步**塊中這有乙個執行緒在操作同步資料。只有當同步**塊中沒有執行緒,才會允許其他的執行緒進入。

同步的好處:解決了執行緒的安全問題。

同步的弊端:相對降低了效率,因為同步外的執行緒都會判斷同步**鎖。

同步的前提:

1、同步中必須有多個執行緒,並且處理乙個共享資料。

2、操作同步**塊時使用同乙個鎖。

同步函式:

不使用同步**塊,將要操作的共享**封裝成乙個方法,並對該方法定義,使其實現同步**塊的功能。

package threaddemo;

/* * 需求:

* 儲戶,兩個。每個都到銀行存錢每次存100,共享三次。

* *同步函式使用的鎖是:this;

* *同步函式和同步**塊的區別:

* 同步函式的鎖是固定的this;而同步**塊的鎖是任意的物件。

* 建議使用同步**塊。

*靜態的同步函式使用的鎖是:該函式所屬位元組碼檔案物件。

*可以用 getclass方法獲取,也可以用當前類名.class表示。

*/class bank

}·}class cus implements runnable }}

public class threaddemo2

}

通過使用上面介紹的同步**塊或同步函式,很好的解決了多執行緒的安全問題。但是,仍然有一些問題,我們需要對其進行進一步的探索。

java高階(二) 多執行緒

即 最大限度的利用cpu資源 當某一線程的處理不需要占用cpu而只和i o等資源打交道時,讓需要占用cpu資源的其他執行緒有機會獲得cpu資源。方法一 通過繼承thread類建立執行緒 class mythread extends thread public class threadtest 方法二...

Java多執行緒 執行緒間通訊(二)

一 生產者 消費者模式 在併發程式設計中使用生產者和消費者模式能夠解決絕大多數併發問題。該模式通過平衡生產線程和消費執行緒的工作能力來提高程式的整體處理資料的速度。生產者消費者模式是通過乙個容器來解決生產者和消費者的強耦合問題。生產者和消費者彼此之間不直接通訊,而通過阻塞佇列來進行通訊,所以生產者生...

(三十一)java多執行緒二

因為執行緒在執行的過程中具有一定的不確定性,在併發的時候就會出現安全問題,因此一般需要採取一定的措施來保證執行緒的安全,同步 塊就是其中一種方式。以下是模擬銀行取錢的多執行緒小例子,兩個都能確保安全,但是有一種卻更好一些。例1 packagedemo1 模擬兩個人同時取乙個賬戶的錢,必須只能有乙個人...