lock--unlock的方式在实际中使用较少,一般使用synchronized获取对象的内部锁替代,但是lock--unlock对了解synchronized有很大的帮助。

创建一个bank对象用于模拟动作

package reentrant_lock;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; /**
* Created by luozhitao on 2017/8/18.
*/
public class Bank { private final double[] accounts;
private Lock bankLock;
private Condition newCondition; public Bank(int n,double intialBalance){ accounts=new double[n]; for(int i =;i<n;i++){
accounts[i]=intialBalance;
} bankLock=new ReentrantLock();
newCondition=bankLock.newCondition(); } //
public void tansfer(int from,int to,double account_m) throws InterruptedException{ bankLock.lock();
int aa=; try{ while (accounts[from]<account_m) {
System.out.println(Thread.currentThread()+"被阻塞");
aa++;
newCondition.await();
} if(aa>) {
System.out.println(Thread.currentThread()+"从阻塞状态被唤醒");
aa=; } accounts[from]-=account_m; System.out.printf("%10.2f from %d to %d",account_m,from,to); accounts[to]+=account_m;
System.out.println("-----");
System.out.printf("the total banlance %10.2f", getTotal()); System.out.println("释放transfer锁之前");
//newCondition.notifyAll();
newCondition.signalAll();
System.out.println("释放transfer锁之后"); } finally { bankLock.unlock(); } } //
public double getTotal(){ bankLock.lock();
try{
double sum=;
for(double a:accounts){ sum+=a;
} return sum; }finally {
bankLock.unlock(); } } // public int size(){ return accounts.length;
}
}

创建线程

package reentrant_lock;

/**
* Created by luozhitao on 2017/8/18.
*/
public class transferRunnable implements Runnable { private Bank bank;
private int fromAccount;
private double maxAccount;
private int DELAY=;
int flag=; public transferRunnable(Bank b,int from,double max){
this.bank=b;
this.fromAccount=from;
this.maxAccount=max; } public void run() { try{
while (true){
int toAccount=(int)((bank.size()-)*Math.random()); System.out.println("toAccount ="+toAccount);
double account_m=maxAccount*Math.random();
System.out.println("account_m is "+account_m);
bank.tansfer(fromAccount,toAccount,account_m); Thread.sleep((int) (DELAY * Math.random()));
flag++; }
}catch (InterruptedException e){e.printStackTrace();} }
}

main

package reentrant_lock;

/**
* Created by luozhitao on 2017/8/18.
*/
public class Banktest { private static final int Naccount=;
private static final double inital_balance=; public static void main(String [] args){ Bank b=new Bank(Naccount,inital_balance); for(int i=;i<;i++){ transferRunnable t=new transferRunnable(b,i,inital_balance); Thread thread=new Thread(t);
thread.start(); } } }

java 并发时使用条件变量--Condition的更多相关文章

  1. java并发多线程显式锁Condition条件简介分析与监视器 多线程下篇(四)

    Lock接口提供了方法Condition newCondition();用于获取对应锁的条件,可以在这个条件对象上调用监视器方法 可以理解为,原本借助于synchronized关键字以及锁对象,配备了 ...

  2. python线程条件变量Condition(31)

    对于线程与线程之间的交互我们在前面的文章已经介绍了 python 互斥锁Lock / python事件Event , 今天继续介绍一种线程交互方式 – 线程条件变量Condition. 一.线程条件变 ...

  3. Java并发(十一):Condition条件

    先做总结: 1.为什么使用Condition条件? synchronized配合Object的wait().notify()系列方法可以实现等待/通知模式. Lock提供了条件Condition,对线 ...

  4. c++并发编程之条件变量(Condition Variable)

    条件变量(Condition Variable)的一般用法是:线程 A 等待某个条件并挂起,直到线程 B 设置了这个条件,并通知条件变量,然后线程 A 被唤醒.经典的「生产者-消费者」问题就可以用条件 ...

  5. [development][C] 条件变量(condition variables)的应用场景是什么

    产生这个问题的起因是这样的: ‎[:] ‎<‎tong‎>‎ lilydjwg: 主线程要启动N个子线程, 一个局部变量作为把同样的参数传入每一个子线程. 子线程在开始的十行会处理完参数. ...

  6. java多线程技术之条件变量

    上一篇讲述了并发包下的Lock,Lock可以更好的解决线程同步问题,使之更面向对象,并且ReadWriteLock在处理同步时更强大,那么同样,线程间仅仅互斥是不够的,还需要通信,本篇的内容是基于上篇 ...

  7. 深入解析条件变量(condition variables)

    深入解析条件变量 什么是条件变量(condition variables) 引用APUE中的一句话: Condition variables are another synchronization m ...

  8. Linux组件封装(二)中条件变量Condition的封装

    条件变量主要用于实现线程之间的协作关系. pthread_cond_t常用的操作有: int pthread_cond_init(pthread_cond_t *cond, pthread_conda ...

  9. python线程的条件变量Condition的用法实例

      Condition 对象就是条件变量,它总是与某种锁相关联,可以是外部传入的锁或是系统默认创建的锁.当几个条件变量共享一个锁时,你就应该自己传入一个锁.这个锁不需要你操心,Condition 类会 ...

随机推荐

  1. angular之自定义 directive

    1,指令的创建至少需要一个带有@Directive装饰器修饰的控制器类.@Directive装饰器指定了一个选择器名称,用于指出与此指令相关联的属性的名字. 2,创建一个highlight.direc ...

  2. [mybatis]Record与Example的用法

    一.Record 一个Record是一个Dao对象(继承Mapper接口),tkmybatis会将record自动映射成sql语句,record中所有非null的属性都作为sql语句,如: 映射的sq ...

  3. Django框架学习笔记(windows环境下安装)

    博主最近开始学习主流框架django 网上大部分的安装环境都linux的 由于博主在windows环境下已经有了 Pycharm编辑器 ,所以决定还是继续在windows环境下学习 首先是下载 链接 ...

  4. ctci1.4

    ;     ;     ; i < len ; i++)         ;      +];     ; i < len; i++){         ';         }      ...

  5. Python之匿名函数(filter,map,reduce)

    参考博客:Python匿名函数详解--http://blog.csdn.net/csdnstudent/article/details/40112803 Python内建函数之——filter,map ...

  6. nyoj35——逆波兰表达式

    逆波兰表达式又称作后缀表达式,在四则混合运算的程序设计中用到. 例如: 1+2写成后缀表达式就是12+ 4+5*(3-2)的后缀表达式就是4532-*+ 后缀表达式在四则运算中带来了意想不到的方便,在 ...

  7. SPOJ MYQ10 (数位DP)

    题意 询问区间[a,b]中的Mirror Number的个数,其中Mirror Number是指把它横着翻转后还能表示同样的数字. 思路 注意这个可不是回文数..除了0,1,8,别的数字翻转过后就不是 ...

  8. [转载]java实现word转pdf

    最近遇到一个项目需要把word 转成pdf,百度了一下网上的方案有很多,比如虚拟打印.给word 装扩展插件等,这些方案都依赖于ms word 程序,在java代码中也得使用诸如jacob或jcom这 ...

  9. 二、DBMS_JOB(用于安排和管理作业队列)

    1.概述 作用:用于安排和管理作业队列,通过使用作业,可以使ORACLE数据库定期执行特定的任务注意:当使用DBMS_LOB管理作业时,必须确保设置了初始化参数job_queue_processes( ...

  10. JDK1.7之 HashMap 源码分析

    转载请注明出处:http://blog.csdn.net/crazy1235/article/details/75451812 类继承关系 构造函数 Entry put put putForNullK ...