package cn.chen.synchronizefunction;
/*
多线程:一个进程中有多个线程可以同时执行任务。
多线程的好处:
1.解决一个进程中可以同时执行多个任务的问题
2.提高资源利用率
多线程的弊端:
1.增加了CPU的负担
2.降低了进程中线程的执行概率
3.出现线程安全问题
4.引发死锁现象
自定义线程的实现方式:
方式一:
1.自定义一个类继承Thread类。
2.重写Thread类的run方法,把自定义线程的代码写再run方法上。
3.创建Thread的子类对象,并调用start方法启动线程。
注意:
1.不可直接调用run方法,否则就相当于直接调用基本方法。
线程安全问题解决方法:
方式一:同步代码块:
同步代码块的格式:
synchronize(锁对象){
需要被同步的代码。
}
方式二:同步函数:同步函数就是使用synchronized修饰一个函数.
同步函数注意事项:
1.如果一个非静态的同步函数的(锁 --对象)是this对象,如果是静态的同步函数(锁---对象)是当前函数所属的类字节码文件(类.class)
2.同步函数的锁对象是固定的,不能由你来指定的
推荐使用同步代码块:
1.同步代码块的锁对象可以由我们自己随意指定,同步函数是固定的,不能由我们来指定。
2.同步代码块可以很方便控制需要被同步代码的范围,同步函数必须是整个函数的所有代码全部被同步了。
案例:一个银行账户5000,两夫妻一人一个卡,取钱一次只能取出1000,要求线程安全。
* */
class BankTHread extends Thread{
static int count = 5000;
public BankTHread(String name){
super(name);
}
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
getMoney();
}
//静态函数
public static synchronized void getMoney(){
while(true){
if(count > 0){
System.out.println(Thread.currentThread().getName()+"取走了1000,还剩余 "+(count-1000));
count = count - 1000;
}else{
System.out.println("余额0元");
break;
}
}
}
}
public class Demo {
public static void main(String[] args) {
// TODO Auto-generated method stub
BankTHread b1 = new BankTHread("老公");
BankTHread b2 = new BankTHread("老婆");
b1.start();
b2.start();
}
}