一、应用场景
在通常情况下,我们在用多线程处理一个问题时,当多个线程要同时处理一个共享的数据时,往往需要通过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
分享到:
相关推荐
在实际开发中,为了提高性能,还可以考虑使用`std::atomic_flag`来实现自旋锁,或者使用`std::mutex`等同步原语来保护非原子操作的部分。此外,无锁数据结构(如无锁栈)虽然能提供更好的并发性能,但实现起来更为...
atomic_t 的初始化使用 `ATOMIC_INIT` 宏来实现,例如: ```c static atomic_t my_counter = ATOMIC_INIT(1); ``` 这个初始化操作是原子的,即在 runtime 之前进行初始化,可以保证正确地反映初始化的值。如果在 ...
在本文档中,我们将深入探讨Linux系统中实现原子操作(atomic operations)的原理以及在使用原子操作时应该注意的问题。原子操作是一类特殊的操作,它保证了即使在多线程环境下,也能够被当作一个不可分割的整体来...
对于整型的原子变量,`std::atomic`还提供了`fetch_add()`、`fetch_sub()`、`++`和`--`等操作,它们在多线程环境下安全地实现了加法和减法。 5. **原子指针操作(Atomic Pointer Operations)** `std::atomic`...
`fs-write-stream-atomic`通过以下方式实现原子写入: 1. **临时文件**:当使用`fs-write-stream-atomic`时,数据首先会被写入一个临时文件。这样可以避免在写入过程中因程序崩溃或异常导致的数据丢失。 2. **原子...
本文将深入探讨`boost_atomic`库的核心概念、使用方法以及其实现原理。 `boost_atomic`库主要为开发者提供了一组跨平台的API,用于处理基本数据类型的原子操作。这些操作包括读取、写入、比较并交换(CAS)、增加和...
4. **动画帧优化**:在requestAnimationFrame中使用atomic-batcher,确保在每一帧只执行一次批处理。 ### 总结 atomic-batcher是一个轻量级且实用的前端工具,可以帮助开发者优化性能,尤其是在处理一系列操作时。...
Java多线程网络编程在实现ATM自动取款机系统中的应用主要涉及到以下几个核心知识点: 1. **Java多线程**:多线程是Java语言的重要特性,它允许多个任务在同一时间执行,提高程序效率。在ATM系统中,每个用户操作...
在这个目录下,你可以找到关于如何安装、配置和使用Atomic-Layout的详细信息,包括示例代码和API文档。通常,开发者可以通过阅读`README.md`文件了解项目的快速入门指南,查看`examples`目录下的实例来学习如何实际...
文件名"atomic"可能是该字体家族的主文件或者样本文件,通常字体文件会以".ttf"(TrueType字体)或".otf"(OpenType字体)为扩展名,用于安装到操作系统中供各种应用程序使用。如果"atomic"是一个压缩包,那么里面...
- 训练模型:使用训练集(v4_atomic_trn.csv)训练机器学习或深度学习模型,使其能够理解和预测人类行为的因果关系。 - 模型评估:通过验证集(v4_atomic_dev.csv)和测试集(v4_atomic_tst.csv)评估模型的泛化...
在IT行业中,"atomic"这个概念可能涉及到多个领域,但在这里与"字体"标签结合,我们可以推断讨论的是Atomic Design理论在网页设计或用户界面(UI)设计中的应用,特别是与字体相关的原子组件。Atomic Design是一种...
在iOS和Mac开发中,Objective-C是主要的编程语言,它在定义实例变量或属性时提供了几个关键的修饰符,包括`volatile`、`nonatomic`和`atomic`。这些关键字对于理解多线程环境下的数据同步和内存管理至关重要。本文将...
"Atomic Alarm Clock"是一款功能丰富的时钟工具,它集成了闹钟、日历等多种实用功能,为用户提供了一站式的计时...如果你正在寻找一个功能强大且易于使用的时钟工具,那么Atomic Alarm Clock无疑是一个值得考虑的选择。
在PyPI上,我们可以找到各种功能各异的模块,今天我们将关注的是"atomic-queue-1.0.1.tar.gz",这是一个Python库的压缩包,用于实现原子操作的队列。这个库的名字直接表明了它的核心功能:提供一种线程安全、可并发...
描述中的“Atomic bitops based version of ext2 atomic bitops”进一步确认了这一点,它提到这是一个基于原子位操作的ext2文件系统的版本,意味着它可能涉及到了如何在不使用锁的情况下修改位,这对于在高并发环境...
《Chronograph Atomic Time Clock 6.40:精准时间同步工具详解》 Chronograph Atomic Time Clock 6.40是一款专业的时间同步工具,专为确保计算机时间与国际原子时保持一致而设计。这款软件的独特之处在于其“绿色...
《Atomic Kotlin》是一本专注于介绍Kotlin编程语言基础的书籍,由Bruce Eckel和Svetlana Isakova合作编写。这本书旨在帮助读者快速入门Kotlin,并通过不断迭代和反馈来提升编程技能。该英文版提供了完整的目录,方便...