`

使用atomic实现银行存取款

    博客分类:
  • java
阅读更多
一、应用场景

   在通常情况下,我们在用多线程处理一个问题时,当多个线程要同时处理一个共享的数据时,往往需要通过synchronized的进行同步,在线程比较多的情况会导致锁竞争太厉害,大部分的时间都花费在了线程切换之间,而对实际的业务缺操作的相对比较少。

下面我们用java.util.concurrent.atomic来实现一个类似的功能,以银行存取款为例子:


public class AtomicAccount {

	
	AtomicLong balance;
	
	public AtomicAccount(long money) {
		balance = new AtomicLong(money);
		System.out.println("Total Money:"+balance);
	}
	
	public void deposit(long money) {
		balance.addAndGet(money);
	}
	
	public void withdraw(long money,int delay) {
		long oldvalue = balance.get();
		if(oldvalue>=money) {
			try {
				Thread.sleep(delay);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
[color=red]			//如果balance和oldvalue相同,则balance=oldvalue - money;
			if(balance.compareAndSet(oldvalue, oldvalue - money)) {[/color]
				System.out.println(Thread.currentThread().getName()+" withdraw " + money +" successfull!" + "balance="+balance);
			} else {
				System.out.println(Thread.currentThread().getName()+" withdraw " + money +" failed!" + "balance="+balance);
			}
		} else {
			System.out.println(Thread.currentThread().getName()+" withdraw " + money +" balance is not enough,withdraw failed!" + "balance="+balance);
		}
	}
}



 public class AtomicAccountTest extends Thread{

	AtomicAccount account;
	
	int delay;
	
	public AtomicAccountTest(AtomicAccount account , int delay) {
		this.account = account;
		this.delay = delay;
	}
	
	public void run() {
		account.withdraw(100, delay);
	}
	
	public static void main(String[] args) {
		
		AtomicAccount account = new AtomicAccount(100);
		AtomicAccountTest thread_1 = new AtomicAccountTest(account,1000);
		AtomicAccountTest thread_2 = new AtomicAccountTest(account,0);
		
		thread_1.start();
		thread_2.start();
	}
}




运行结果:

Total Money:100
Thread-1 withdraw 100 successfull!balance=0
Thread-0 withdraw 100 failed!balance=0


二、说明:

//如果balance和oldvalue相同,则balance=oldvalue - money;
执行到if(balance.compareAndSet(oldvalue, oldvalue - money)) 的时候,会判断balance与oldvalue是否相同,如果相同,说明没有程序篡改,则balance=oldvalue - money



分享到:
评论

相关推荐

    安全栈表实现,C++11实现,使用atomic特性

    在实际开发中,为了提高性能,还可以考虑使用`std::atomic_flag`来实现自旋锁,或者使用`std::mutex`等同步原语来保护非原子操作的部分。此外,无锁数据结构(如无锁栈)虽然能提供更好的并发性能,但实现起来更为...

    atomic_ops原子操作1

    atomic_t 的初始化使用 `ATOMIC_INIT` 宏来实现,例如: ```c static atomic_t my_counter = ATOMIC_INIT(1); ``` 这个初始化操作是原子的,即在 runtime 之前进行初始化,可以保证正确地反映初始化的值。如果在 ...

    atomic_ops.pdf

    在本文档中,我们将深入探讨Linux系统中实现原子操作(atomic operations)的原理以及在使用原子操作时应该注意的问题。原子操作是一类特殊的操作,它保证了即使在多线程环境下,也能够被当作一个不可分割的整体来...

    C++ 11 开发中的 Atomic 原子操作.rar_C++11、原子_atomic c++_c++ atomic使用_c++

    对于整型的原子变量,`std::atomic`还提供了`fetch_add()`、`fetch_sub()`、`++`和`--`等操作,它们在多线程环境下安全地实现了加法和减法。 5. **原子指针操作(Atomic Pointer Operations)** `std::atomic`...

    fs-write-stream-atomic-类似`fs.createWriteStream(...)`但是是原子的

    `fs-write-stream-atomic`通过以下方式实现原子写入: 1. **临时文件**:当使用`fs-write-stream-atomic`时,数据首先会被写入一个临时文件。这样可以避免在写入过程中因程序崩溃或异常导致的数据丢失。 2. **原子...

    boost_atomic.7z

    本文将深入探讨`boost_atomic`库的核心概念、使用方法以及其实现原理。 `boost_atomic`库主要为开发者提供了一组跨平台的API,用于处理基本数据类型的原子操作。这些操作包括读取、写入、比较并交换(CAS)、增加和...

    前端开源库-atomic-batcher

    4. **动画帧优化**:在requestAnimationFrame中使用atomic-batcher,确保在每一帧只执行一次批处理。 ### 总结 atomic-batcher是一个轻量级且实用的前端工具,可以帮助开发者优化性能,尤其是在处理一系列操作时。...

    java多线程网络编程实现ATM自动取款机系统

    Java多线程网络编程在实现ATM自动取款机系统中的应用主要涉及到以下几个核心知识点: 1. **Java多线程**:多线程是Java语言的重要特性,它允许多个任务在同一时间执行,提高程序效率。在ATM系统中,每个用户操作...

    Atom-atomic-layout,布局组合的物理表示,用于在react中创建声明性响应布局。.zip

    在这个目录下,你可以找到关于如何安装、配置和使用Atomic-Layout的详细信息,包括示例代码和API文档。通常,开发者可以通过阅读`README.md`文件了解项目的快速入门指南,查看`examples`目录下的实例来学习如何实际...

    Atomic

    文件名"atomic"可能是该字体家族的主文件或者样本文件,通常字体文件会以".ttf"(TrueType字体)或".otf"(OpenType字体)为扩展名,用于安装到操作系统中供各种应用程序使用。如果"atomic"是一个压缩包,那么里面...

    atomic_data.tgz

    - 训练模型:使用训练集(v4_atomic_trn.csv)训练机器学习或深度学习模型,使其能够理解和预测人类行为的因果关系。 - 模型评估:通过验证集(v4_atomic_dev.csv)和测试集(v4_atomic_tst.csv)评估模型的泛化...

    atomic

    在IT行业中,"atomic"这个概念可能涉及到多个领域,但在这里与"字体"标签结合,我们可以推断讨论的是Atomic Design理论在网页设计或用户界面(UI)设计中的应用,特别是与字体相关的原子组件。Atomic Design是一种...

    volatile,nonatomic和atomic关键字测试

    在iOS和Mac开发中,Objective-C是主要的编程语言,它在定义实例变量或属性时提供了几个关键的修饰符,包括`volatile`、`nonatomic`和`atomic`。这些关键字对于理解多线程环境下的数据同步和内存管理至关重要。本文将...

    时钟工具Atomic Alarm Clock

    "Atomic Alarm Clock"是一款功能丰富的时钟工具,它集成了闹钟、日历等多种实用功能,为用户提供了一站式的计时...如果你正在寻找一个功能强大且易于使用的时钟工具,那么Atomic Alarm Clock无疑是一个值得考虑的选择。

    PyPI 官网下载 | atomic-queue-1.0.1.tar.gz

    在PyPI上,我们可以找到各种功能各异的模块,今天我们将关注的是"atomic-queue-1.0.1.tar.gz",这是一个Python库的压缩包,用于实现原子操作的队列。这个库的名字直接表明了它的核心功能:提供一种线程安全、可并发...

    ext2-atomic-setbit.rar_atomic

    描述中的“Atomic bitops based version of ext2 atomic bitops”进一步确认了这一点,它提到这是一个基于原子位操作的ext2文件系统的版本,意味着它可能涉及到了如何在不使用锁的情况下修改位,这对于在高并发环境...

    Chronograph Atomic Time Clock 6.40(校时原子钟的时间工具)英文绿色特别版

    《Chronograph Atomic Time Clock 6.40:精准时间同步工具详解》 Chronograph Atomic Time Clock 6.40是一款专业的时间同步工具,专为确保计算机时间与国际原子时保持一致而设计。这款软件的独特之处在于其“绿色...

    Atomic Kotlin pdf 下载 英文版

    《Atomic Kotlin》是一本专注于介绍Kotlin编程语言基础的书籍,由Bruce Eckel和Svetlana Isakova合作编写。这本书旨在帮助读者快速入门Kotlin,并通过不断迭代和反馈来提升编程技能。该英文版提供了完整的目录,方便...

Global site tag (gtag.js) - Google Analytics