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(); } }