1. 程式人生 > >多執行緒程式設計:兩個人A、B同時對一個賬戶取錢(A從ATM取,B從櫃檯取)

多執行緒程式設計:兩個人A、B同時對一個賬戶取錢(A從ATM取,B從櫃檯取)

分析:

1)賬戶的錢必須設定是靜態的

2)所有人操作的是同一個賬戶,操作的時候要加同步鎖

程式碼:

package ThreadTest;
 
import java.util.Objects;
 
public class Bank {
	// 假設一個賬戶有1000塊錢  
	static double money = 1000;
	// 櫃檯Counter取錢的方法  
	private void Counter(double money) {
		Bank.money -= money;
		System.out.println("櫃檯取錢" + money + "元,還剩" + Bank.money + "元!");
	}
	// ATM取錢的方法  
	private void ATM(double money) {
		Bank.money -= money;
		System.out.println("ATM取錢" + money + "元,還剩" + Bank.money + "元!");
	}
	
	//提供一個對外取款途徑,防止直接調取方法同時取款時,併發餘額顯示錯誤
	public synchronized void outMoney(double money, String mode) throws Exception{
		if(money > Bank.money){
			//校驗餘額是否充足
			throw new Exception("取款金額"+money+",餘額只剩"+Bank.money+",取款失敗");
		}
		if(Objects.equals(mode, "ATM")){
			ATM(money);
		} else {
			Counter(money);
		}
	}
 
}
package ThreadTest;
 
public class PersonA extends Thread {
 
	Bank bank;
	
	String mode;
 
	public PersonA(Bank bank, String mode) {
		this.mode = mode;
		this.bank = bank;
	}
 
	public void run (){
		while(bank.money >= 100){
			try {
				bank.outMoney(100, mode);
			} catch (Exception e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			try {
				sleep(100);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}
package ThreadTest;
 
public class PersonB extends Thread {
	Bank bank;
	
	String mode;
 
	public PersonB(Bank bank, String mode) {
		this.bank = bank;
		this.mode = mode;
	}
 
	public void run() {
		while (bank.money >= 200) {
			try {
				bank.outMoney(200, mode);
			} catch (Exception e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			try {
				sleep(100);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}
}
package ThreadTest;
 
/**
 * 兩個人AB通過一個賬戶A在櫃檯取錢和B在ATM機取錢
 * */
public class MainClass {
	public static void main(String[] args) {
		Bank bank = new Bank();
		// 例項化兩個人,傳入同一個銀行的物件
		PersonA a = new PersonA(bank, "Counter");
		PersonB b = new PersonB(bank, "ATM");
		a.start();
		b.start();
	}
}

結果:

櫃檯取錢100.0元,還剩900.0元!
ATM取錢200.0元,還剩700.0元!
ATM取錢200.0元,還剩500.0元!
櫃檯取錢100.0元,還剩400.0元!
櫃檯取錢100.0元,還剩300.0元!
ATM取錢200.0元,還剩100.0元!
櫃檯取錢100.0元,還剩0.0元!

相關推薦

執行程式設計個人AB同時一個賬戶AATMB櫃檯

分析: 1)賬戶的錢必須設定是靜態的 2)所有人操作的是同一個賬戶,操作的時候要加同步鎖 程式碼: package ThreadTest; import java.util.Objects; public class Bank { // 假設一個賬戶有100

java學習筆記-執行程式設計模擬十個人過山洞

編寫多執行緒應用程式,模擬多個人通過一個山洞的模擬。這個山洞每次只能通過一個人,每個人通過山洞的時間為5秒,隨機生成10個人,同時準備過此山洞,顯示一下每次通過山洞人的姓名。   使用執行緒同步,把山洞看做臨界資源,五秒內只允許一個人來訪問。 class cave { p

Java併發十八):阻塞佇列BlockingQueue BlockingQueue阻塞佇列詳解 二叉堆(一)之 圖文解析 和 C語言的實現 多執行緒程式設計:阻塞併發佇列的使用總結 Java併發程式設計:阻塞佇列 java阻塞佇列 BlockingQueue阻塞佇列詳解

阻塞佇列(BlockingQueue)是一個支援兩個附加操作的佇列。 這兩個附加的操作是:在佇列為空時,獲取元素的執行緒會等待佇列變為非空。當佇列滿時,儲存元素的執行緒會等待佇列可用。 阻塞佇列常用於生產者和消費者的場景,生產者是往佇列裡新增元素的執行緒,消費者是從佇列裡拿元素的執行緒。阻塞佇列就是生產者

執行程式設計三個售票視窗同時賣出20張票

分析: 1)票數要使用一個靜態值,才能所有視窗共享(執行緒) 2)要使用執行緒同步鎖,才不會有多個視窗同時賣出一張票 程式碼: package ThreadTest; /* * 多個視窗同時賣出20張票 */ public class Station extend

iOS開發之再探執行程式設計Grand Central Dispatch詳解

Swift3.0相關程式碼已在github上更新。之前關於iOS開發多執行緒的內容釋出過一篇部落格,其中介紹了NSThread、操作佇列以及GCD,介紹的不夠深入。今天就以GCD為主題來全面的總結一下GCD的使用方式。GCD的歷史以及好處在此就不做過多的贅述了。本篇部落格會通過一系列的例項來好好的總結一下GC

執行程式設計偽共享以及其解決方案

首先本文是根據多篇部落格的整合而來,依照本人的理解所寫 1.基本概念的瞭解 回到正題,建議先從下面的部落格連結看起以便對下列概念有個基本的瞭解: 1)CPU快取 2)MESI協議以及RFO請求 3)快取行 具體部落格連結:https://www.cnbl

執行例項二----個人同時存取

java 多執行緒簡單例項二----兩個人同一個賬戶取錢 思路:兩個執行緒,一個代表取錢的操作,一個代表存錢的操作,互相不影響,但是要保證存取的資料正確。 程式碼如下: package com.shone.thread.getmoney; /** * Created b

執行 共享資源 同步鎖 java Java執行程式設計Lock

Java多執行緒程式設計:Lock   synchronized是java中的一個關鍵字,也就是說是Java語言內建的特性。那麼為什麼會出現Lock呢?   如果一個程式碼塊被synchronized修飾了,當一個執行緒獲取了對應的鎖,並執行該程式碼塊時,其他執行緒便只

Java 執行程式設計之“執行實現一個執行列印奇數一個執行列印偶數”

題目:t從0到N,一個執行緒列印奇數,一個執行緒列印偶數,按順序打印出來。            最終列印結果:0,1,2,3,4,...,N;            思路:兩個執行緒間的通訊採用等待,喚醒方法——列印奇偶數由flag控制,當flag為真時列印偶數; 列

Android 執行程式設計Handler訊息傳遞機制—重新整理UI主介面

一、為什麼使用Handler   當一個Activity執行的時候,會開啟一條主執行緒,主執行緒主要負責處理與UI相關的事件,主執行緒不允許其他子執行緒操控它,更新UI介面。既然不允許我們在子執行緒中操控UI介面,那麼,像我們平時所見的點選獲取驗證碼,不斷更新

Linux使用執行程式設計和訊息佇列實現個程序之間的聊天

思路: 一個檔案:建立一個執行緒和主函式,或者建立兩個執行緒主函式呼叫(我用這種)。 建立兩個訊息佇列, 一共兩個檔案,兩個佇列,四個程序 a.c    一個程序寫(訊息型別為1)   ---->>佇列     一個程序讀(訊息型別為2) b.c   一

《Java執行程式設計實戰》——第5章 Two-phase Termination階段終止模式

Two-phase Termination模式通過將停止執行緒分解為準備階段和執行階段兩個階段,提供了一種通用的優雅停止執行緒的方法。 準備階段:通知目標執行緒準備進行停止。 設定標誌變數。 呼叫目標執行緒的interrupt方法。 對於能夠對interrupt方法呼

Java執行程式設計筆記2synchronized同步方法

非執行緒安全會在多個執行緒對同一個物件中的例項變數進行併發訪問時發生,產生的結果就是髒讀,也就是取到的資料是被更改過的。執行緒安全就是獲得的例項變數的值是經過同步處理的。 方法內的變數是執行緒安全的 方法內的變數是執行緒安全的。非執行緒安全的問題存在於例項變數中,如果是方法內部的私有變數,不存在非執行緒安

Java執行程式設計筆記10單例模式

立即載入:“餓漢模式” 立即載入就是指使用類的時候已經將物件建立完畢,常見的實現方法就是直接new例項化。也就是在呼叫方法前,例項就被建立了。示例程式碼如下所示: class MyObject { private static MyObject myObject=new MyObject();

《JAVA執行程式設計實戰指南》之Two-phase Termination(階段終止)模式

本文是《JAVA多執行緒程式設計實戰指南》的樣章,感謝作者授權併發網(ifeve.com)發表此文。感謝demochen整理此文。 5.1Two-phase Termination模式簡介 停止執行緒是一個目標簡單而實現卻不那麼簡單的任務。首先,Java沒有提供直接的API用於停止執行緒。此

MFC筆記——執行程式設計3用_beginthreadex()來代替使用CreateThread()

        CreateThread()函式是Windows提供的API介面,在C/C++語言另有一個建立執行緒的函式_beginthreadex(),在很多書上(包括《Windows核心程式設計》)提到過儘量使用_begin

Java執行程式設計-6-種常用的執行計數器CountDownLatch和迴圈屏障CyclicBarrier

原文出自 : https://blog.csdn.net/xlgen157387/article/details/78218736 倒計時CountDownLatch CountDownLatch是一個非常實用的多執行緒控制工具類,稱之為“倒計時器”,它允許一個或多個執

讀書筆記java執行程式設計核心技術

讀書筆記,簡單記錄....(都是從我的有道雲筆記直接複製的,沒有進行發表修改, 讀者見諒!) 第一章 掌握執行緒的啟動 暫停 停止 優先順序 安全性等 1.1程序 與 執行緒 程序 作業系統結構的基礎,是一次程式的執行,是系統進行資源分配和排程的獨立單位,簡單理解

linux執行程式設計(C)訊號量實現的執行安全佇列

用訊號量實現的執行緒安全佇列。 簡單有用的示例程式, 比起互斥量的實現在多執行緒時效率更好。 cir_queue.h /* * \File * cir_queue.h * \Brief * circular queue */#ifndef __CIR_QUEUE_H_

JAVA併發執行程式設計之同步“監視器monitor”

在JAVA虛擬機器中,每個物件(Object和class)通過某種邏輯關聯監視器,為了實現監視器的互斥功能,每個物件(Object和class)都關聯著一個鎖(有時也叫“互斥量”),這個鎖在作業系統書籍中稱為“訊號量”,互斥(“mutex”)是一個二進位制的訊號量。 如果一個執行緒擁有了某些資料的鎖,其他的