银行存钱与取钱的例子能够很好的说明线程同步的概念
一:首先定义帐号类,其中有一个余额的字段:
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多线程和线程同步的例子,完整源码 原来的一个不知道CSDN怎么把文件搞丢了!新传一个资源,包含一个线程排序的例子!代码均搜集自网上!
c#线程同步的典型例子,通过这个例子你很容易了解线程同步问题。
在《秒杀多线程系列》的前十五篇中介绍多线程的相关概念,多线程同步互斥问题《秒杀多线程第四篇一个经典的多线程同步问题》及解决多线程同步互斥的常用方法——关键段、事件、互斥量、信号量、读写锁。为了让大家...
很好的介绍了线程同步的使用 里面的例子非常简洁 适合学习
java多线程同步互斥访问实例,对于初学者或是温故而知新的同道中人都是一个很好的学习资料
线程同步代码集实例,包括Event同步,Mutex同步,Section同步,Semaphore同步等实现的例子
java多线程经典案例,线程同步、线程通信、线程阻塞等经典案例
java线程同步的例子.doc java线程同步的例子.doc
java多线程知识点,源代码案例,代码案例中包括如何创建线程,主线程,线程优先级,线程组,线程同步,死锁,线程间的通信知识点
java线程同步实例,哲学家思考的代码实现,应该是一个比较好的例子
java线程同步的例子.pdf
一个详细讲解JAVA_线程同步与死锁的例子 希望可以帮助到你。
代码中对线程的几种同步的方法进行了举例.
Java 多线程访问的经典例子,一个个代码 手动敲出,可以加深或理解 多线程访问 线程安全与同步的问题.
java线程同步的例子[文].pdf
swift NSThread线程同步买票小例子
Java线程同步例子.pdf