银行存钱与取钱的例子能够很好的说明线程同步的概念
一:首先定义帐号类,其中有一个余额的字段:
public class BankAccount {
private int balance;//余额
public BankAccount( int balance) {
this.balance = balance;
}
/**
*返回余额
*/
public int getBalance() {
return balance;
}
/**
* 存款
*/
public void deposit(int amount) {
balance += amount;
}
/**
* 取款
*/
public void withdraw(int amount) {
balance -= amount;
}
}
二,新建存钱的线程,模拟存钱10000次
public class Depositor implements Runnable {
BankAccount account;
int amount;
public Depositor(BankAccount account, int amount) {
this.account = account;
this.amount = amount;
}
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
account.deposit(amount);
}
}
}
三:新建取钱的线程,模拟取钱10000次
public class Withdrawer implements Runnable {
BankAccount account;
int amount;
public Withdrawer(BankAccount account, int amount) {
this.account = account;
this.amount = amount;
}
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
account.withdraw(amount);
}
}
}
四,测试类
public class BankAccountTest {
public static void main(String[] args) throws InterruptedException{
BankAccount account = new BankAccount(1000);
Thread t1 = new Thread(new Depositor(account, 100), "depositor");
Thread t2=new Thread(new Withdrawer(account, 100),"withdrawer");
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println("余额:"+account.getBalance());
}
}
运行完成后,结果应该还是初始的1000才对。不幸的是,这样的运行结果是不正确的,而且每次结果还不一样。
五,如果将帐号类的取钱与存钱方法稍加改进,加上同步关键字,则结果就是对的:
public class BankAccount {
private int balance;
public BankAccount( int balance) {
this.balance = balance;
}
public int getBalance() {
return balance;
}
/**
* 存款
*/
public synchronized void deposit(int amount) {
balance += amount;
}
/**
* 取款
*/
public synchronized void withdraw(int amount) {
balance -= amount;
}
}
分享到:
相关推荐
这个“线程同步小例子”是基于孙鑫先生著作中的示例进行改进的,旨在帮助我们深入理解线程同步的机制和实践。 线程同步的主要目标是控制线程对共享数据的访问,以防止不正确的数据状态。在多线程环境下,如果多个...
本文将深入探讨Delphi中的多线程和线程同步,并以"SortThreads"和"delphi-thread-gui"这两个示例项目为例,讲解如何在实践中应用这些概念。 1. **多线程**:多线程允许应用程序同时执行多个独立的任务,提高程序的...
C#线程同步是多线程编程中的一个重要概念,它涉及到如何控制多个线程对共享资源的访问,以避免数据不...通过实践和调试这些典型的C#线程同步例子,你可以深入理解各种同步机制的工作方式,并学会在实际项目中灵活运用。
在《秒杀多线程系列》的前十五篇中介绍多线程的相关概念,多线程同步互斥问题《秒杀多线程第四篇一个经典的多线程同步问题》及解决多线程同步互斥的常用方法——关键段、事件、互斥量、信号量、读写锁。为了让大家...
线程同步是多线程编程中的一个重要概念,它主要用于解决多个线程并发访问共享资源时可能出现的竞争条件问题,确保数据的一致性和完整性。在Windows API中,提供了多种线程同步机制,如Event、Mutex、Semaphore和...
很好的介绍了线程同步的使用 里面的例子非常简洁 适合学习
"多线程的批量线程同步解决方案"这个标题暗示我们探讨的是如何在多线程环境下有效地管理和同步多个任务,确保数据一致性与程序正确性。下面将详细阐述相关知识点。 一、多线程基础 多线程是指在一个进程中同时执行...
java多线程同步互斥访问实例,对于初学者或是温故而知新的同道中人都是一个很好的学习资料
在编程领域,线程同步是多线程编程中的一个核心概念,它确保多个线程在访问共享资源时能正确地协调执行,防止数据竞争和不一致的状态。在C#中,线程同步可以通过多种机制来实现,其中包括信号量(Semaphore)和加锁...
本文将深入探讨Java多线程中的关键知识点,包括创建线程、主线程、线程优先级、线程组、线程同步以及线程间的通信。 1. **创建线程** 在Java中,可以通过两种方式创建线程:继承`Thread`类或实现`Runnable`接口。...
在Windows Forms(Winform)应用程序中,线程同步是一个关键概念,它确保了多线程环境中的数据一致性、避免竞态条件以及防止UI线程被阻塞。在本资源包中,你可能会找到一系列用于理解和实践Winform线程同步的源代码...
在这个“线程同步解决火车站售票问题”的例子中,我们可以通过线程同步机制来实现售票的有序、无冲突的过程。 首先,我们需要理解问题的核心:10个售票处(线程)需要共享1000张票(资源),并且每卖出一张票,必须...
本案例将深入探讨Java多线程中的关键知识点,包括线程同步、线程通信和线程阻塞。 线程同步是为了防止多个线程同时访问共享资源,导致数据不一致。Java提供了多种同步机制,如synchronized关键字、Lock接口...
在这个例子中,我们将讨论如何使用`synchronized`关键字实现线程同步,以及它的工作原理。 首先,我们有两个类`ThreadDemo`和`ThreadTest`。`ThreadDemo`实现了`Runnable`接口,其中包含两个版本的线程同步:一个是...
QT4线程同步的小例子是针对QT框架下多线程编程的一个示例,它为初学者提供了一个深入了解线程同步机制的平台。在多线程编程中,线程同步是确保多个线程间数据安全、避免竞态条件和死锁的关键技术。QT库提供了丰富的...
在"MfcMutexes"这个例子中,我们可以期待看到如何使用CMutex类进行线程同步的示例。一个典型的用法可能包括创建一个CMutex对象,然后在线程中使用`Lock()`和`Unlock()`方法来控制对共享资源的访问。如果有多个线程...
本文将通过一个具体的案例——售票窗口模拟——来深入探讨线程同步的原理和实现。 #### 一、线程同步的重要性 在并发编程中,多个线程可能同时对同一份数据进行读写操作,如果没有适当的同步机制,可能会导致数据...
根据提供的信息,我们可以深入探讨Java线程同步以及代码示例中的关键知识点。 ### Java线程同步实例:哲学家就餐问题 #### 1. 哲学家就餐问题简介 哲学家就餐问题是多线程编程中一个经典的同步问题。该问题描述为...
线程同步是多线程编程中的重要概念,它主要用于解决多个线程并发访问共享资源时可能出现的竞争条件问题,确保数据的正确性和程序的稳定性。在Java等编程语言中,线程同步可以通过多种方式实现,本实例将探讨其中的几...