线程安全问题

66 阅读1分钟

首先,什么是线程安全问题呢?

线程安全问题指的是,多个线程同时操作同一个共享资源的时候,可能会出现业务安全问题。

线程同步方案

为了解决线程安全问题,我们可以使用线程同步思想。同步最常见的方案就是加锁,意思是每次只允许一个线程加锁,加锁后才能进入访问,访问完毕后自动释放锁,然后其他线程才能再加锁进来。

第一种(同步代码块)

public void brawMoney(double money){
    String name = Thread.currentThread().getName();
    synchronized (this) {
        if (this.money>=money){
            System.out.println(name+"来取了"+money+"元");
            this.money-=money;
            System.out.println(name+"取完钱后,账户还剩余"+this.money+"元");
        }else {
            System.out.println(name+"来取钱,账户里的钱不够");
        }
    }
}

第二种(同步方法,synchronized关键字)

public synchronized void brawMoney(double money){
    String name = Thread.currentThread().getName();
    if (this.money>=money){
        System.out.println(name+"来取了"+money+"元");
        this.money-=money;
        System.out.println(name+"取完钱后,账户还剩余"+this.money+"元");
    }else {
        System.out.println(name+"来取钱,账户里的钱不够");
    }
}

第三种(lock锁)

final Lock lock=new ReentrantLock();
public void brawMoney(double money){
    String name = Thread.currentThread().getName();

     lock.lock();
    try {
        if (this.money>=money){
            System.out.println(name+"来取了"+money+"元");
            this.money-=money;
            System.out.println(name+"取完钱后,账户还剩余"+this.money+"元");
        }else {
            System.out.println(name+"来取钱,账户里的钱不够");
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        lock.unlock();
    }
}