package com.lxk.threadTest.bank;
/**
* 银行model,一个总金额属性。
* <p>
*
* @author lxk on 2017/6/26
*/
public class Bank {
/**
* 给银行个启动资金,不然怎么干生意呢。
*/
private int sum = 200;
//这个从来不这么用,但也算是正确的一种加锁的机制:同步代码块。
//Object obj = new Object();
/**
* 存钱
* 要是不加[synchronized--同步函数],则会出现多线程安全问题。
*/
public synchronized void add(int n) {
//synchronized (obj) {
sum = sum + n;
try {
Thread.sleep(10);
}
catch (Exception ignore) {
}
//当存钱次数变多的时候,就可以发现,存钱的线程确实是2个在交替执行存钱这个动作的。
System.out.println(Thread.currentThread().getName() + "...sum=" + sum);
//}
}
/**
* 取钱
* 要是不加[synchronized--同步函数],则会出现多线程安全问题。
*/
public synchronized void reduce(int n) {
if (sum - n >= 0) {
sum = sum - n;
} else {
System.out.println("bank's money is not enough !");
}
try {
Thread.sleep(30);
}
catch (Exception ignore) {
}
//当存钱次数变多的时候,就可以发现,存钱的线程确实是2个在交替执行存钱这个动作的。
System.out.println(Thread.currentThread().getName() + "...sum=" + sum);
}
}
package com.lxk.threadTest.bank;
/**
* 顾客,实现runnable()接口,多个人可以一起存钱
*
* @author lxk on 2017/6/26
*/
public class Customer implements Runnable {
/**
* 存钱类型
*/
static final String TYPE_ADD = "add";
/**
* 取钱类型
*/
static final String TYPE_REDUCE = "reduce";
/**
* 银行
*/
private Bank bank;
/**
* 对钱的操作类型,存钱or取钱
*/
private String type;
/**
* 操作的次数,理论上是个正数
*/
private int time;
/**
* 要存或者取多少钱
*/
private int money;
public Customer() {
}
public Customer(Bank bank, String type, int time, int money) {
this.bank = bank;
this.type = type;
this.time = time;
this.money = money;
}
@Override
public void run() {
for (int x = 0; x < time; x++) {
if (TYPE_ADD.equals(type)) {
bank.add(money);
} else if (TYPE_REDUCE.equals(type)) {
bank.reduce(money);
}
}
}
}
package com.lxk.threadTest.bank;
/**
* 银行存钱的多线程实例
* <p>
* 【需求:】
* 银行有一个金库。
* 有两个储户分别存或者取n * 100。
* 目的:该程序是否有安全问题,如果有,如何解决?
* <p>
* 【如何找问题:】
* 1,明确哪些代码是多线程运行代码。
* 2,明确共享数据。
* 3,明确多线程运行代码中哪些语句是操作共享数据的。
*
* @author lxk on 2017/6/26
*/
public class Main {
public static void main(String[] args) {
//一个银行and多个客户
Bank bank = new Bank();
int time = 10000;
int money = 100;
//这个客户存钱
Customer c1 = new Customer(bank, Customer.TYPE_ADD, time, money);
//这个客户取钱
Customer c2 = new Customer(bank, Customer.TYPE_REDUCE, time, money);
Thread t1 = new Thread(c1);
Thread t2 = new Thread(c2);
t1.start();
t2.start();
}
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有