同步代码块应用之取钱问题、线程安全问题之线程同步机制(同步函数)

一、同步代码块经典实例: 
1、需求:一个银行账户5000块,两夫妻一个拿着存折,一个拿着卡,开始取钱比赛,每次只能取一千块,要求不准出现线程安全问题。

2、目的:该程序是否有安全问题,如果有,如何解决? 

3、如何找问题: 
1)明确哪些代码是多线程运行代码。 
2)明确共享数据。 
3)明确多线程运行代码中哪些语句是操作共享数据的。

4、代码解决: 
方式一: 

方式二(正确方法):

package sram.thread;

public class BankThread extends Thread{
    static int money = 5000;
    public BankThread(){

    }
    public BankThread(String name){
        super(name);
    }
    public void run() {
        while(true){
            synchronized("锁"){
                if(money>0){
                    System.out.println(currentThread().getName()+
                        "取了1000元,还剩"+(money-1000)+"元");
                    money-=1000;
                }
            }
        }
    }

    public static void main(String args[]){
        BankThread user1 = new BankThread("老公");
        BankThread user2 = new BankThread("老婆");
        user1.start();
        user2.start();
    }
}

二、同步函数: 
1、同步函数定义:同步函数就是使用synchronized修饰一个函数。

2、同步函数要注意的事项 : 
1)如果是一个非静态的同步函数的锁对象是this对象,如果是静态的同步函数的锁对象是当前函数所属的类的字节码文件(class对象)。 
a)非静态同步函数(锁不住): 
使用形式一: 

使用形式二: 

b)静态同步函数: 

图解: 

2)同步函数的锁对象是固定的,不能由你来指定的。

3、同步代码块、同步函数对比(推荐使用: 同步代码块)。 
原因: 
1)同步代码块的锁对象可以由我们随意指定,方便控制。同步函数的锁对象是固定的,不能由我们来指定。 
2)同步代码块可以很方便控制需要被同步代码的范围,同步函数必须是整个函数的所有代码都被同步了。

转载于:https://my.oschina.net/u/204616/blog/1587413

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值