多线程之锁

package com.ruizhukai.demo01;
/*
*
* t1和t2
*
* 异步变成模型: t1线程执行t1的    t2线程执行t2的   两个线程之间谁也不等谁
* 同步编程模型: t1线程和t2线程执行   当t1线程必须等t2线程执行结束之后,t1线程才能执行,这是同步编程模型
*
*
*  什么时候要同步呢? 为什么要引入线程同步呢?
*   1.为了数据的安全,尽管应用程序的使用率降低,但是为了保证数据是安全的,必须加入线程同步机制
*
*   2.什么条件下要使用线程同步
*       第一,必须是多线程环境
*       第二,多线程环境共享同一个数据
*       第三,共享的数据涉及到修改操作
*
*
*   以下程序演示取款例子
* */
public class TestThread5 {
    public static void main(String[] args) {
       Account a = new Account("actno-001" ,500.0);

       Prooessoes p = new Prooessoes(a);
       Thread t1 = new Thread(p);
       Thread t2 = new Thread(p);


       t1.start();
        t2.start();
    }
}
//取款线程
class Prooessoes implements Runnable{
    //账户
    Account act;

    //Constructor
    Prooessoes (Account act){
        this.act = act;
    }

    @Override
    public void run() {
        act.withdraw(100.0);
        System.out.println("取款成功" + act.getBalance());
    }
}

//账户
class Account{
    private String actno;//账户
    private double balance;//余额

    public Account(){}
    public Account(String actno,double balance){
        this.actno = actno;
        this.balance = balance;
    }

    public void setActno(String actno){
        this.actno = actno;
    }
    public void setBalance(double balance){
        this.balance = balance;
    }

    public double getBalance(){
        return balance;
    }
    public String getActno(){
        return actno;
    }
    //对外取款的方法
    public void withdraw(double money){//对当前账号进行取款操作
        //把需要同步的代码,放到同步语句块中
        /*
                原理:t1綫程和t2线程
                t1线程执行到此处,遇到了synchronized关键字,就会去找this的对象锁
                如果找到this对象锁,则进入同步语句块中执行程序,当替补语句块中的代码
                执行结束之后,t1线程归还this的对象锁

                在t1线程的同步语句块中,如果t2线程也过来执行以下代码,也遇到synchronized关键字
                ,所以也去找this的对象锁,但是该对象锁被t1线程持有
                只能在这等待this对象的归还
         */
        synchronized(this) {
            double after = balance - money;//剩余的钱=取款之前的金额-取款金额
            //延迟,使得线程有序排序
            try{
                Thread.sleep(1000);
            }
            catch (Exception e ){

            }
            //更新
            this.setBalance(after);
        }
    }
}

猜你喜欢

转载自www.cnblogs.com/rzkwz/p/12417452.html