synchronized三种用法

package com.javase.threadsafe3;
/**
 * 用关键字synchronized修饰实例方法
 *     1.synchronized出现在实例方法上,锁的一定是this,没有选择,为此不灵活。
 *     2.synchronized出现在实例方法上,表示整个方法都需要同步,可能会出现无故扩大同步范围,导致程序执行效率降低。
 *     3.优点:代码写的少,简化了代码。如果共享的对象是this,并且需要同步的代码块是整个方法体,建议使用这种方式。
 *
 * 总结:synchronized有三种用法:
 *      第一种:同步代码块
 *           优点:灵活
 *           synchronized(线程共享对象){
 *               同步代码块;
 *           }
 *
 *       第二种:synchronized用在实例方法上
 *           表示共享对象一定是this,并且同步代码块是整个方法体。
 *
 *       第三种:在静态方法上使用synchronized
 *           这里的锁是类锁    创建了100个对象,这100个对象也只有一把类锁
 *           对象锁: 创建了100个对象 就有100把对象锁。
 */
public class Account {
//    账户
    private String act;
//    余额
    private double balance;
//    构造方法(无参)

    public Account() {
    }

//    构造方法(有参)

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

//    set and get 方法

    public String getAct() {
        return act;
    }

    public void setAct(String act) {
        this.act = act;
    }

    public double getBalance() {
        return balance;
    }

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

//    toString()方法

    @Override
    public String toString() {
        return "Account{" +
                "act='" + act + '\'' +
                ", balance=" + balance +
                '}';
    }

//    取款方法(这里就是把synchronized 应用在实例方法上,这里锁的就是this)
    public synchronized void withdraw(double money){
//        获取取款前金额
        double before = this.getBalance();
//        取款后金额
        double after = before - money;
//        更新余额
        this.setBalance(after);
    }
}
package com.javase.threadsafe3;

public class AccountThread implements Runnable {
    //两个线程同享一个账户
    private Account act;
    
    //构造方法(无参)
    public AccountThread() {
    }

    //构造方法(有参)
    public AccountThread(Account act) {
        this.act = act;
    }

    //重写run方法
    @Override
    public void run() {
        //启动线程运行run()方法,就开始取款
        //设定取款金额
        double money = 5000;
        //调用取款方法
        act.withdraw(money);
        //取款后输出提示信息
        System.out.println(Thread.currentThread().getName() + "对账户:" + act.getAct() + "取款金额是:" + money + "账户余额是:" + act.getBalance());
    }
}
package com.javase.threadsafe3;

public class Text {
    public static void main(String[] args) {
        //创建账户
        Account account = new Account("111111",10000);
        //创建两个线程(共享同一个账户account)
        Thread thread1 = new Thread(new AccountThread(account));
        Thread thread2 = new Thread(new AccountThread(account));
        //启动线程
        thread1.start();
        thread2.start();
    }
}

/*

程序运行结果:

Thread-1对账户:111111取款金额是:5000.0账户余额是:5000.0
Thread-0对账户:111111取款金额是:5000.0账户余额是:0.0

*/

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值