亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

以銀行取錢為例模擬Java多線程同步問題完整代碼

2024-07-13 10:14:56
字體:
來源:轉載
供稿:網友

簡單了解下在操作系統中進程和線程的區別:

  進程:每個進程都有獨立的代碼和數據空間(進程上下文),進程間的切換會有較大的開銷,一個進程包含1--n個線程。(進程是資源分配的最小單位)

  線程:同一類線程共享代碼和數據空間,每個線程有獨立的運行棧和程序計數器(PC),線程切換開銷小。(線程是cpu調度的最小單位)

  線程和進程一樣分為五個階段:創建、就緒、運行、阻塞、終止。

  多進程是指操作系統能同時運行多個任務(程序)。

  多線程是指在同一程序中有多個順序流在執行。首先存錢取錢的這個操作,應該是線程操作的,可以有很多的顧客,這意思就是得有多個線程,多個線程之間共同操作一個銀行,銀行的金額就需要同步。才能保證線程安全。

所以,下面就把這個代碼的實例放這,有不對的地方,還請指出來哈。因為有個老鐵問這個多線程的代碼。

首先是銀行,這個對象model的創建。

java;">package com.lxk.threadTest.bank;/**  * 銀行model,一個總金額屬性。  * <p>  *  * @author lxk on 2017/6/26  */public class Bank {	/**    * 給銀行個啟動資金,不然怎么干生意呢。    */	private int sum = 200;	//這個從來不這么用,但也算是正確的一種加鎖的機制:同步代碼塊。 	//Object obj = new Object(); 	/**    * 存錢    * 要是不加[synchronized--同步函數],則會出現多線程安全問題。    */	public synchronized void add(int n) {		//synchronized (obj) { 		sum = sum + n;		try {			Thread.sleep(10);		}		catch (Exception ignore) {		}		//當存錢次數變多的時候,就可以發現,存錢的線程確實是2個在交替執行存錢這個動作的。 		System.out.println(Thread.currentThread().getName() + "...sum=" + sum);		//}	}	/**    * 取錢    * 要是不加[synchronized--同步函數],則會出現多線程安全問題。    */	public synchronized void reduce(int n) {		if (sum - n >= 0) {			sum = sum - n;		} else {			System.out.println("bank's money is not enough !");		}		try {			Thread.sleep(30);		}		catch (Exception ignore) {		}		//當存錢次數變多的時候,就可以發現,存錢的線程確實是2個在交替執行存錢這個動作的。 		System.out.println(Thread.currentThread().getName() + "...sum=" + sum);	}}

在代碼里面有存和取2個方法,這2個方法,以及一個總金額,里面有部分被注釋掉的代碼,那個是簡單易懂好理解的,多線程加鎖互斥,保證線程間同步的方法。

但是這個是不常用的方法,常用的就是使用synchronized這個關鍵字來修飾同步方法。

客戶對象的model

package com.lxk.threadTest.bank;/**  * 顧客,實現runnable()接口,多個人可以一起存錢  *  * @author lxk on 2017/6/26  */public class Customer implements Runnable {	/**    * 存錢類型    */	static final String TYPE_ADD = "add";	/**    * 取錢類型    */	static final String TYPE_REDUCE = "reduce";	/**    * 銀行    */	private Bank bank;	/**    * 對錢的操作類型,存錢or取錢    */	private String type;	/**    * 操作的次數,理論上是個正數    */	private int time;	/**    * 要存或者取多少錢    */	private int money;	public Customer() {	}	public Customer(Bank bank, String type, int time, int money) {		this.bank = bank;		this.type = type;		this.time = time;		this.money = money;	}	@Override 	  public void run() {		for (int x = 0; x < time; x++) {			if (TYPE_ADD.equals(type)) {				bank.add(money);			} else if (TYPE_REDUCE.equals(type)) {				bank.reduce(money);			}		}	}}

客戶對象,因為可以很多個客戶同時訪問一個銀行,所以,這個存錢取錢的操作就用線程來實現。

屬性就構造方法傳值了。

main方法

package com.lxk.threadTest.bank;/**  * 銀行存錢的多線程實例  * <p>  * 【需求:】  * 銀行有一個金庫。  * 有兩個儲戶分別存或者取n * 100。  * 目的:該程序是否有安全問題,如果有,如何解決?  * <p>  * 【如何找問題:】  * 1,明確哪些代碼是多線程運行代碼。  * 2,明確共享數據。  * 3,明確多線程運行代碼中哪些語句是操作共享數據的。  *  * @author lxk on 2017/6/26  */public class Main {	public static void main(String[] args) {		//一個銀行and多個客戶 		Bank bank = new Bank();		int time = 10000;		int money = 100;		//這個客戶存錢 		Customer c1 = new Customer(bank, Customer.TYPE_ADD, time, money);		//這個客戶取錢 		Customer c2 = new Customer(bank, Customer.TYPE_REDUCE, time, money);		Thread t1 = new Thread(c1);		Thread t2 = new Thread(c2);		t1.start();		t2.start();	}}

上述代碼實際運行效果如下圖。

java,多線程同步,實例,多線程同步例子,java多線程實例,java多線程開發實例,java多線程例子

這個存取錢的次數要是小了,就可能會看到2個線程有先后順序,所以,這個次數咱整多點,然后,就看到如圖所示的情況,線程1是取錢的,線程0時存錢的,可以看到2個線程是互相交錯執行的,有存有取,沒有規律可言。

這個就保證了數據的同步了。

至于如何才能不同步,也就是異常的現象,

你可以把add方法的這個synchronized關鍵字去掉之后,把次數調小一點改成3次,sum的初始值給設置成0.你再試試代碼,

就會發現所謂的不同步現象。

java,多線程同步,實例,多線程同步例子,java多線程實例,java多線程開發實例,java多線程例子

上圖的右邊就是不同步的結果,2個人每次存100,存三次,總數是不是得,100,200,300,400,500,600.得長。

但是,運行結果卻不是的,

這個時候,你再把synchronized給add方法加上去,就會出現左邊的圖的結果,這個就是正確的結果。

我是為了,有存有取,所以,就又加了個方法。代碼就變成上面的樣子啦。

差不多都是線程間同步的例子啦。

我就簡單記錄下代碼。用的時候,可以分分鐘就拿出來。

總結

以上就是本文關于以銀行取錢為例模擬Java多線程同步問題完整代碼的全部內容,希望對大家有所幫助。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品日韩电影| 日本91av在线播放| 国产做受69高潮| 亚洲系列中文字幕| 国产精品流白浆视频| 国产精品欧美一区二区三区奶水| 日韩国产精品亚洲а∨天堂免| 成人www视频在线观看| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲人成在线观看网站高清| 日韩高清电影免费观看完整版| 亚洲色图第一页| 中文字幕欧美视频在线| 精品久久久久久久久国产字幕| 国产午夜精品久久久| 欧美激情啊啊啊| 亚洲午夜未满十八勿入免费观看全集| 国产亚洲精品久久久久久| 精品亚洲精品福利线在观看| 日韩av免费观影| 欧美激情精品久久久久久| 日韩大陆欧美高清视频区| 4k岛国日韩精品**专区| 欧美在线观看视频| 国产成人精品久久久| 日韩av在线免费观看| yellow中文字幕久久| 国产精品黄页免费高清在线观看| 午夜精品视频网站| 日韩成人av在线播放| 亚洲人成人99网站| 粉嫩老牛aⅴ一区二区三区| 亚洲精品日韩丝袜精品| 成人激情视频在线播放| 国产一区二区丝袜高跟鞋图片| 久久理论片午夜琪琪电影网| 伊人久久五月天| 亚洲在线观看视频网站| 欧美最猛性xxxxx亚洲精品| 欧美亚洲一区在线| 日韩电影免费观看在线观看| 成人xvideos免费视频| 富二代精品短视频| 亚洲国产高潮在线观看| 成人在线中文字幕| 亚洲www视频| 久久免费视频这里只有精品| 成人亚洲综合色就1024| 日本一区二区在线播放| 国产欧美日韩精品专区| 高清一区二区三区日本久| 亚洲综合日韩中文字幕v在线| 97香蕉久久超级碰碰高清版| 精品视频中文字幕| 中文字幕成人在线| 91久久中文字幕| 98午夜经典影视| 亚洲精品乱码久久久久久金桔影视| 亚洲黄色免费三级| 另类专区欧美制服同性| 精品美女国产在线| 亚洲欧美视频在线| 亚洲肉体裸体xxxx137| 欧美另类69精品久久久久9999| 国产99视频精品免视看7| 国产一区二中文字幕在线看| 亚洲欧美日韩精品| 国产福利精品av综合导导航| 国产精品香蕉av| 欧美午夜视频在线观看| 欧美精品生活片| 亚洲人成电影在线| 欧美大人香蕉在线| 亚洲国产美女久久久久| 欧美在线一区二区视频| 国产成人精品免费久久久久| www.日韩不卡电影av| 美女av一区二区三区| 亚洲aⅴ日韩av电影在线观看| 欧美精品亚州精品| 成人性生交大片免费观看嘿嘿视频| 久久久久久久久久久av| 国产日韩欧美中文| 久久久精品美女| 久久91亚洲精品中文字幕奶水| 久久五月情影视| 成人免费激情视频| 日韩av电影在线免费播放| 亚洲美女动态图120秒| 亚洲成色777777在线观看影院| 91色视频在线观看| 粉嫩老牛aⅴ一区二区三区| 日韩久久午夜影院| 91精品国产综合久久香蕉| 国产精品自拍偷拍| 亚洲精品国产美女| 久久久久亚洲精品国产| 在线观看精品自拍私拍| 668精品在线视频| 4438全国亚洲精品在线观看视频| 亚洲wwwav| 日本三级久久久| 日韩av电影手机在线| 久久夜色精品国产欧美乱| 国产日韩在线精品av| 日韩电影免费观看在线| 成人网中文字幕| 欧美激情视频网址| 久色乳综合思思在线视频| 久久久天堂国产精品女人| 最近的2019中文字幕免费一页| 136fldh精品导航福利| 国模精品一区二区三区色天香| 欧美专区国产专区| 国产成人精品免高潮费视频| 久久91超碰青草是什么| 午夜精品在线观看| 国产精品国产自产拍高清av水多| 深夜福利一区二区| 亚洲精品中文字| 中文字幕日韩有码| 国产精品青草久久久久福利99| 久久精品国产电影| 亚洲精品suv精品一区二区| 国产又爽又黄的激情精品视频| 亚洲美女av在线| 国产精选久久久久久| 成人伊人精品色xxxx视频| 亚洲欧美日韩中文在线制服| 91精品国产乱码久久久久久久久| 日韩欧美中文字幕在线播放| 欧美高清视频一区二区| 久久久久久九九九| 国产69精品久久久久久| 欧美亚洲国产另类| 97热精品视频官网| 欧美性猛交xxxx| 国产综合久久久久久| 欧美天堂在线观看| 亚洲欧美制服中文字幕| 久久99久久亚洲国产| 国产成人一区二区| 久久久国产一区二区三区| 亚洲午夜未满十八勿入免费观看全集| 国产精品99久久久久久人| 成年无码av片在线| 91成品人片a无限观看| 亚洲一区二区三区视频播放| 亚洲国产精品久久久久久| 久久久午夜视频| 久久免费国产视频| 亚洲深夜福利视频| 欧美极品美女视频网站在线观看免费| 欧美韩国理论所午夜片917电影| 国产日韩精品一区二区| 日韩av在线影视| 欧美在线播放视频| 国产亚洲日本欧美韩国| 日韩久久午夜影院| 亚洲福利影片在线| 欧美乱大交xxxxx另类电影| 欧美激情伊人电影| 精品国产成人av| 红桃av永久久久|