您的位置:首页 > 编程语言 > Java开发

java多线程回顾3:线程安全

2016-03-23 11:47 477 查看

1、线程安全问题

关于线程安全问题,有一个经典案例:银行取钱问题。

假设有一个账户,有两个线程从账户里取钱,如果余额大于取钱金额,则取钱成功,反之则失败。

下面来看下线程不安全的程序会出什么问题。

账户类:

//定义锁对象

private final Lock lock = new ReentrantLock();

//取钱的方法

public void draw(int money){

//加锁

lock.lock();

try {

if (balance >= money) {

//此处让线程Thread-1睡眠1秒,是为了模拟线程不安全造成的错误

if ("Thread-1".equals(Thread.currentThread().getName())) {

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

balance = balance - money;

System.out.println(Thread.currentThread().getName()+"取钱成功,余额:"+balance);

}else{

System.out.println("取钱失败,余额不足。余额:"+balance);

}

} finally {

//为了确保解锁,放在finally里

lock.unlock();

}

}


View Code

以上代码中,为了确保最后能释放锁,所以把解锁代码放在finally中。

和synchronized相比,Lock在使用上更灵活。上例中使用的是可重入锁,即线程可以对已加锁的代码再加锁。此外还有读写锁等。

3、死锁

两个线程相互等待对方释放对同步监视器的锁定,这种情况叫死锁。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: