多线程——引用同步函数解决经典储户银行存钱问题

时间:2022-09-16 18:05:52
package com.work.wor01;
/**
 * 引入同步函数的概念:
 * 
 * 需求:有两个储户同时到一个银行去存钱,每人存3次,每次存100元。
 * 要求打印出银行每次金额的变化情况(假设在储户存钱之前,银行金额为0)
 * 
 * 分析:得出有两个类:银行和储户
 * 这是一个多线程的问题,如何分析他的线程安全问题呢?
 * 1.通过线程的任务代码分析。
 * 2.有没有共享数据,有没有多条语句在操作共享数据。
 * */
class Bank{
	private int sum = 0;
	public void add(int num){
		try {
			Thread.sleep(10);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		sum = sum + num;	
		System.out.println(Thread.currentThread().getName()+"...sum="+sum);
	}
}

class Customer implements Runnable{

	Bank b = new Bank();
	Object obj = new Object();
	private int sum = 0;

	/**
	 * 同步代码块和函数的封装内容是一样的,直接用函数就可以了么?
	 * 答:是不行的。
	 * 差别在哪里呢?函数不具备同步性,那让函数具备同步性就可以了。
	 * 
	 * 怎么让函数具备同步性呢?
	 * 直接让同步关键字作为修饰符,修饰函数即可,此时函数就具备了同步性。
	 * 
	 * 用同步关键字修饰的函数就是同步函数,它是同步的另一种体现形式。
	 * 这种形式的特点是写法简单。
	 * */
	@Override
	public synchronized void run() {
			for(int i = 0;i<3;i++){
				b.add(100);
			}
	}
}

public class BankThread {
	public static void main(String[] args) {
		Customer c = new Customer();
		
		Thread t1 = new Thread(c);
		Thread t2 = new Thread(c);
		
		t1.start();
		t2.start();
	}
}