以YH取钱为例模拟Java多线程同步问题完整代码
发布时间:2020-05-29 21:59:30 所属栏目:Java 来源:互联网
导读:简单了解下在操作系统中进程和线程的区别: 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程。(进程是资源分配的最小单位)
|
简单了解下在操作系统中进程和线程的区别: 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含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);
/ |
