用Lock对象来同步线程,实现生产者消费者模式
来源:互联网 发布:c 和java那个早 编辑:程序博客网 时间:2024/05/21 04:40
import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class DeadLock {public static void main(String[] args) {Account ac = new Account(4, "qhairen");new Thread(new Drawer(ac)).start();new Thread(new Depositer(ac)).start();new Thread(new Depositer(ac)).start();new Thread(new Depositer(ac)).start();}}class Account {private String name;private int total;private Lock lock = new ReentrantLock();public Account(int total, String name) {this.total = total;this.name = name;}public void draw() {lock.lock();try{while(total <= 0) {lock.unlock();try {Thread.sleep(10);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}lock.lock();}--total;System.out.println(name + " draw, now $" + total);try {Thread.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}} finally {lock.unlock();}}public void deposit() {lock.lock();try {while(total >= 5) {lock.unlock();try {Thread.sleep(10);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}lock.lock();}++total;System.out.println(name + " deposit, now $" + total);try {Thread.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}} finally {lock.unlock();}}}class Drawer implements Runnable {private Account ac;public Drawer(Account ac){this.ac = ac;}public void run() {while(true) {ac.draw();}}}class Depositer implements Runnable{private Account ac;public Depositer(Account ac){this.ac = ac;}public void run() {while(true) {ac.deposit();}}}
简述synchronized和java.util.concurrent.locks.Lock的异同 ?
主要相同点:Lock能完成synchronized所实现的所有功能
主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。Lock还有更强大的功能,例如,它的tryLock方法可以非阻塞方式去拿锁。
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
private Lock lock = new ReentrantLock();
lock.lock();
try{
.......
} finally{
lock.unlock();
}
ps:unlock()最好放在函数的最后,不然其他线程会得到锁,就可能不执行该线程剩下的代码了。
0 0
- 用Lock对象来同步线程,实现生产者消费者模式
- 线程同步--生产者消费者模式
- 多线程---使用ManualResetEvent来控制线程间的同步(实现了消费者和生产者模式)
- Java线程间同步实现生产者-消费者模式
- 生产者消费者模式的线程同步问题
- 同步线程--生产者与消费者模式
- 生产者消费者模式(同步线程)
- 线程同步中的“生产者和消费者”模式
- Qt之线程同步(生产者消费者模式
- Qt之线程同步(生产者消费者模式
- 线程同步–生产者与消费者模式
- 生产者、消费者 线程同步
- 线程同步--生产者消费者
- Java 多线程 (PART XVIII) Lock(II)用lock实现生产者消费者模式
- 使用Lock来实现生产者和消费者问题
- 使用Lock来实现生产者和消费者问题
- 使用Lock来实现生产者和消费者问题
- 使用Lock来实现生产者和消费者问题
- 公司网页添加旺旺,状态不正确
- C++学习 boost学习之-numeric_cast
- C/C++内存分配
- nehe的opengl教程 opengl窗口章 移植到vs2013 win7环境下
- 在ASP.NET中Dictionary用法
- 用Lock对象来同步线程,实现生产者消费者模式
- 自动循环刷新功能
- nusoap在thinkphp下创建webservice
- windows程序设计--Chap4
- 如何形象地解释 JavaScript 中 map、foreach、reduce 间的区别?
- TServerSocket 安装及衍生知识
- 使用Doxygen生成net帮助文档
- QML概念及框架--在组件中添加属性
- 一种实用的上传参数和文件呢的工具类