以银行取钱为例模拟以银行取钱为例模拟Java多线程同步问题完整代码多线程同步问题完整代码
主要介绍了以银行取钱为例模拟Java多线程同步问题完整代码,具有一定借鉴价值,需要的朋友可以参考下。
简单了解下在操作系统中进程和线程的区别:
进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程。
(进程是资源分配的最小单位)
线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。(线程是cpu调
度的最小单位)
线程和进程一样分为五个阶段:创建、就绪、运行、阻塞、终止。
多进程是指操作系统能同时运行多个任务(程序)。
多线程是指在同一程序中有多个顺序流在执行。首先存钱取钱的这个操作,应该是线程操作的,可以有很多的顾客,这意
思就是得有多个线程,多个线程之间共同操作一个银行,银行的金额就需要同步。才能保证线程安全。
所以,下面就把这个代码的实例放这,有不对的地方,还请指出来哈。因为有个老铁问这个多线程的代码。
首先是银行,这个对象model的创建。
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);
}
}
在代码里面有存和取2个方法,这2个方法,以及一个总金额,里面有部分被注释掉的代码,那个是简单易懂好理解的,多线
程加锁互斥,保证线程间同步的方法。
但是这个是不常用的方法,常用的就是使用synchronized这个关键字来修饰同步方法。
评论0