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. Spring MVC:控制器类名称处理映射

    控制器类名称处理映射的好好处是: 如果项目是hello,WelcomeController是控制器,那么访问地址是: http://localhost:8080/hello/welcome http: ...

  2. FontAwesome::Sass(5.x版)使用帮助。

    FontAwesome::Sass(5.x版) https://fontawesome.com/icons?d=gallery&m=free 只能使用免费的. 在app/assets/styl ...

  3. 关于BFS和dijkstra(2019.04.20)

    我的BFS板子 struct node{/*略*/};//表示一个状态 std::map<node,bool>vis;//判断每个状态是否已访问过 std::queue<node&g ...

  4. LightOJ - 1151概率dp+高斯消元

    概率dp+高斯消元 https://vjudge.net/problem/LightOJ-1151 题意:刚开始在1,要走到100,每次走的距离1-6,超过100重来,有一些点可能有传送点,可以传送到 ...

  5. Lua学习笔记2. lua变量和 循环

    1. lua中变量的作用域有三种:全局,局部,表中的域 需要注意的是默认的变量都是全局变量,必须声明为local的变量才是局部变量,即使是在函数里面没有使用local修饰的变量依然是全局变量!!!! ...

  6. HDU 4665 Mutiples on a circle (圆环DP)

    题意 N个数的圆环上有多少种方案可以使得选出来的一段数是K的倍数(N<=50000, K<=200, a[i]<=1000). 思路 多校第七场1004.圆上的DP--大脑太简单处理 ...

  7. Linux中awk后面的RS, ORS, FS, OFS 用法

    Linux中awk后面的RS, ORS, FS, OFS 含义 一.RS 与 ORS 差在哪   我们经常会说,awk是基于行列操作文本的,但如何定义“行”呢?这就是RS的作用.  默认情况下,RS的 ...

  8. WTH统计

    SELECT t2.MasterName AS '类型',SUM(t1.DailyCount) AS '数量',(CASE T2.MasterName WHEN '电子阅读' THEN '篇' WHE ...

  9. hdu1569

    题解: 网络流 最大权独立集=总和-最大流 然后构图 代码: #include<cstdio> #include<cmath> #include<cstring> ...

  10. 20165202 week4课下补做

    1.相关知识点的总结 编程实现1!+2!+3!+... + N!的功能,N由命令行传入,比如类名为SumofRecur, java SumofRecur 8 给出1!+2!+3!+... + 8!的值 ...