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、死锁
两个线程相互等待对方释放对同步监视器的锁定,这种情况叫死锁。相关文章推荐
- java多线程回顾2:生命周期与控制
- Ubuntu上安装Maven Eclipse以及配置
- (java)求N阶乘末尾0的个数
- Android之eclipse配置SDK
- java 中文转拼音
- struts2标签笔记
- Java千百问_02基本使用(005)_Mac环境下无法打开eclipse怎么办
- JavaMail发送邮件
- JAVA基础1 运算符、流程控制语句、
- Java——DOM4J方式生成XML
- struts2异常处理机制-----值栈作用
- 纯java从apk文件里获取包名、版本号、icon
- split表达式使用注意特殊符号需要转义
- java学习de路线建议
- 保存时 实体实现接口 会报Unknown entity $$EnhancerByCGLIB$
- java基础--遍历Map的四种方法
- SSH框架系列:Spring配置多个数据源
- java maven项目找不到jconsole-1.8.0.jar和tools-1.8.0.jar包
- Java中HashMap和TreeMap的区别深入理解
- 【技巧】Eclipse常用插件在线安装地址