多线程入门03——浅谈线程同步问题

时间:2020-09-19 00:41:54   收藏:0   阅读:54

线程同步问题

1.没有线程同步的例子

技术分享图片
出现了负数,也就是说不符合实际情况的。

2.线程同步问题的解决——使用队列+锁

3. 关键字synchronized

4. 死锁

5. 锁机制(lock()、和unlock()方法)

6. Lock vs synchronized

7. 安全的代码示例

package com.pbx.lesson02;

/**
 * 模拟两个人同时从一个银行账户中取钱
 *
 * @author BruceXu
 * @date 2020/9/13
 */
public class ThreadNotSync {
    public static void main(String[] args) {
        Account account = new Account("棺材本", 100);
        new Bank(account, 50, "我").start();
        new Bank(account, 100, "老婆").start();
    }
}

class Account {
    String name;
    int Money;

    public Account(String name, int Money) {
        this.name = name;
        this.Money = Money;
    }
}

class Bank extends Thread {
    private final Account account;
    private final int drawing;
    private int currentMoney = 0;

    public Bank(Account account, int drawing, String name) {
        super(name);
        this.account = account;
        this.drawing = drawing;
    }

    // 取钱
    @Override
    public void run() {
        // synchronized 加锁原则:谁要被改,给谁加锁
        synchronized (account) {
            // 判断还有钱吗
            if (account.Money - drawing < 0) {
                System.out.println("没钱了,别取了" + this.getName());
                return;
            }
            //模拟延迟
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            account.Money -= drawing;
            currentMoney += drawing;
            // 结果查看
            System.out.println(this.getName() + "取了:" + drawing + ",账户还剩:" + account.Money);
        }
    }
}

原文:https://www.cnblogs.com/primabrucexu/p/13694072.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!