锁对象——线程学习五
来源:互联网 发布:淘宝网小饰品批发 编辑:程序博客网 时间:2024/05/16 06:16
有两种机制防止代码块受并发访问的干扰。java语言提供一个synchronized关键字达到这一目的,并且在java SE 5.0后引入了ReentrantLock类。
这里用ReentrantLock保护代码块的基本结构如下:
一.ReentrantLock类
1.ReentrantLock()
构建一个可以被用来保护临界区的可重入锁。
2.ReentrantLock(boolean fair);
构建一个带有公平策略的锁,一个公平锁偏爱等待时间最长的线程。但是,这一公平的保证将大大的降低性能。所以,默认情况下,锁没有被强制为公平的。
二、ReentrantLock类的方法
1.void lock()
获得这个锁。如果锁同时被另一个线程拥有则发生阻塞
2.void unlock()
释放这个锁。
首先new一个ReentrantLock类的对象,
private Lock bankLock = new ReentrantLock();public void transfer(int from,int to,double amount){bankLock.lock();try {if(accounts[from]<amount){return;}System.out.println("Thread.currentThread():"+Thread.currentThread());accounts[from] -= amount;System.out.println("转账金额数amount:"+amount+" from:"+from+" to:"+to);accounts[to] += amount;System.out.println("getTotalBalance()账户剩余金额:"+getTotalBalance());}finally{bankLock.unlock();//释放锁必须放在finally之中,这样不论线程正常还是异常退出,都会释放锁,不影响其他的线程继续使用。}}
假定一个线程调用transfer,在执行结束前被剥夺了运行权。假定第二个线程也调用transfer,由于第二个线程不能获得锁,将在调用lock方法时被阻塞。它必须等待第一个线程完成transfer方法的执行之后才能再度被激活。
添加锁再运行程序,这样银行的余额不会出现讹误。
阅读全文
0 0
- 锁对象——线程学习五
- 线程知识学习五——并发
- linux多线程学习(五)——信号量线程控制
- linux多线程学习(五)——信号量线程控制
- linux多线程学习(五)——信号量线程控制
- linux多线程学习(五)——信号量线程控制
- linux多线程学习(五)——信号量线程控制
- linux多线程学习(五)——信号量线程控制
- linux多线程学习(五)——信号量线程控制
- java线程学习(五)—java内存模型自己总结
- java线程学习(五)—java内存模型自己总结
- 线程学习(五)
- JavaScript学习笔记(五)——函数对象2
- JavaScript学习笔记五——类和对象
- 每天学习一点c++之五——面向对象
- javascript面向对象学习笔记(五)——模块化
- 条件对象(条件变量)——线程学习六
- java线程学习(2)—对象的共享
- 在51单片机上使用DHT11测温湿度
- 文件名
- word 制作流程图
- 模拟实现队列
- maven打成jar包
- 锁对象——线程学习五
- Android:生成随机数,生成10个随机数,存入sdcard中的随机生成文件中
- Android Architecture Componets
- QT中UDPSocket丢包问题
- jq插件设置浏览器缓存
- com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
- 第一章,java的开发运行环境
- 阿里云_数加平台类HQL的那些坑
- ios获取运营商和网络的demo