同步函数解决线程安全

来源:互联网 发布:苹果mac 怎样更新系统 编辑:程序博客网 时间:2024/06/05 07:22

需求:

        一个银行账户5000元,夫妻二人一人拿着存折,一人拿着卡,每次只能取1000块。

 

class BankThread extends Thread{static int count =5000;public BankThread(String name){super(name);}@Overridepublic synchronized void run(){while(true){if(count>0){System.out.println(Thread.currentThread().getName()+"取走了1000块,还剩"+(count-1000)+"元");count=count-1000;}else{System.out.println("取光了……");break;}}}}public class Demo{public static void main(String[] args){//创建两个线程对象BankThread thread1=new BankThread("老公");BankThread thread2=new BankThread("老婆");//调用start方法开启线程去栈thread1.start();thread2.start();}}

同步函数要注意的事项:

1、如果是一个非静态的同步函数的锁对象是this对象,如果是静态的同步函数的锁对象是当前函数所属的类的字节码文件(class对象)

2、同步函数的锁对象是固定的,不能指定


推荐使用同步代码块,原因如下:

1、同步代码块的锁对象是可以由程序员指定的,同步函数的锁对象是固定的。

2、同步代码块可以很方便控制需要同步代码的范围,同步函数必须是整个函数的所有代码都被同步。


原创粉丝点击