/*
* 进程:进程就是正在运行的应用程序。进程负责了内存空间的划分
* 线程:一个进程中的代码是由线程去执行的,线程也是进程中的一个执行路径
* 多线程:一个进程中有多个线程可以同时执行任务。
* 线程安全问题的解决方案:
* 方案一、可以使用同步代码块去解决
* 格式:
* synchronized(锁对象){ //这里的锁对象必须是多线程共享的一个资源,否则锁不住。
* 需要被同步的代码块
* }
* 方案二、同步函数: 同步函数就是使用synchronized修饰一个函数
* 同步函数注意事项:
* 1.如果是一个非静态的同步函数的锁对象是this对象,如果是静态的同步函数的锁对象是当前函数所属的类的字节码文件(class对象)
* 2.同步函数的锁对象是固定的,不能由你来指定。
* 推荐使用:同步代码块
* 原因:
* 1.同步代码块的锁对象可以由我们随意指定,方便控制。同步函数的锁对象是固定的,不能由我们来指定
* 2.同步代码块可以很方便控制需要被同步代码的范围,同步函数必须是整个函数的所有代码都被同步了
* 进程:进程就是正在运行的应用程序。进程负责了内存空间的划分
* 线程:一个进程中的代码是由线程去执行的,线程也是进程中的一个执行路径
* 多线程:一个进程中有多个线程可以同时执行任务。
* 线程安全问题的解决方案:
* 方案一、可以使用同步代码块去解决
* 格式:
* synchronized(锁对象){ //这里的锁对象必须是多线程共享的一个资源,否则锁不住。
* 需要被同步的代码块
* }
* 方案二、同步函数: 同步函数就是使用synchronized修饰一个函数
* 同步函数注意事项:
* 1.如果是一个非静态的同步函数的锁对象是this对象,如果是静态的同步函数的锁对象是当前函数所属的类的字节码文件(class对象)
* 2.同步函数的锁对象是固定的,不能由你来指定。
* 推荐使用:同步代码块
* 原因:
* 1.同步代码块的锁对象可以由我们随意指定,方便控制。同步函数的锁对象是固定的,不能由我们来指定
* 2.同步代码块可以很方便控制需要被同步代码的范围,同步函数必须是整个函数的所有代码都被同步了
* /
* 需求:一个银行账户5000块,两夫妻一个拿着存折,一个拿着卡,开始取钱比赛,每次只能取1000块,要求不准出现线程安全问题。
运行结果为:
老公取走了1000块,还剩5000元
老公取走了1000块,还剩4000元
老公取走了1000块,还剩3000元
老公取走了1000块,还剩2000元
老公取走了1000块,还剩1000元
没钱了
没钱了