當我們有多個執行緒要對同乙個資源
進行操作的時候,比如說檔案,這時候就不能讓多個執行緒同時操作這個檔案了。因為當檔案共享的時候,多個操作就會產生衝突
。相信使用過git
進行團隊開發的人就會有比價深刻的體會。
這時候就需要引入執行緒的同步
機制。
所謂同步
,是指乙個乙個執行,也就是排隊
,幾個執行緒排隊執行,讓執行緒之間有乙個先來後到的關係。這樣,就不會產生爭搶的現象,也就不會出現衝突。
乙個有兩個執行緒
的程式,第乙個執行緒計算2~1000
之間的偶數及個數,第二個執行緒計算1000~2000
之間的偶數及個數。
首先,我們根據題目來設計一下實現方式。
1.定義兩個執行緒。這裡要定義自己的執行緒類,然後去設定計算偶數的開始和結束可以看到實現方式很簡單。初步實現如下:2.實現計算所給範圍內的偶數和偶數個數
3.執行執行緒
public class mytread extends thread
}
@override
public void run()
// 獲取偶數以及個數
private void geteven(int begin, int end)
for (; begin <= end; begin += 2)
system.out.println();
system.out.println("偶數個數為:" + count);
}
public static void main(string args)
注:這裡為了展示後面的效果,所以將數字範圍減小。
看一下結果:
好像並不是我們想要的效果。我們想要這樣的效果:
我們想要每一部分的偶數和偶數個數都在一起,但是我們實現後的效果確實兩部分混亂出現的。
要解決上面出現的問題,就要用到我們最開始說的執行緒同步
了。
根據我們開始的介紹,發現實現同步的乙個條件就是有乙個共享的資源
。那麼我們的**裡什麼是這個共享的資源
呢?貌似沒有。所以先建立乙個。
我們這裡的共享資源完全就可以是同乙個物件
,所以我們就另外建立乙個類,用來示例共享資源。
public class even {}
細心的人會發現,這個方法跟我們最開始寫的方法有點不同,它多了乙個關鍵字:public class even
for (; begin <= end; begin += 2)
system.out.println();
system.out.println("偶數個數為:" + count);}}
synchronized
。通過這個關鍵字,我們就能在執行方法的時候,實現執行緒同步了。
這時候,我們再來執行一下:public class mytread extends thread
}
實現了我們想要的效果。
最後,附上完整**:
/**
* 偶數類
*/public class even
for (; begin <= end; begin += 2)
system.out.println();
system.out.println("偶數個數為:" + count);
}}public class mytread extends thread
@override
public void run()
public static void main(string args)
}
java 執行緒 執行緒同步
threadlocal與其它同步機制的比較 threadlocal和其他所有的同步機制都是為了解決多執行緒中的對同一變數的訪問衝突。在普通的同步機制中,是通過對物件加鎖來實現多個執行緒對同一變數的安全訪問的。這時該變數是多個執行緒共享的,使用這種同步機制需要很細緻的分析在什麼時候對變數進行讀寫,什麼...
java同步執行緒
同步執行緒 synchronized方法 乙個類中任何方法都可以定義為synchronized方法以防止多執行緒資料崩潰。當某個物件用synchronized方法修飾時,表明該物件在任一時刻只能由乙個執行緒訪問。宣告方法體的一般格式 modifier synchronized returntype ...
Java執行緒同步
該例子共有4個類,分別是account 賬戶類 bank 取款 company 增款 client 使用者 bank類會模擬100次取款,每次1000,company類會模擬100次增款,每次1000。使用者初始賬戶為1000,所以正確情況應該是餘額依然為1000。下面是account源 packa...