`

java condition lock

阅读更多
package com.cn.whu;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ThreadConditionLook {

	/**
	 * @param args
	 */
	//create a user's Account,watch out the "static"
	private static Account account = new Account();
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ExecutorService executor = Executors.newFixedThreadPool(2);
		executor.execute(new DepositTask());
		executor.execute(new WithdrawTask());
		executor.shutdown();
		System.out.println("Thread 1\t\tThread 2\t\t\t\tBalance");
	}
	private static class Account{
		//create a new lock
		private static Lock lock = new ReentrantLock();
		//craete a condition
		private static Condition newDeposit = lock.newCondition();
		private int  balance =0;
		public int getBalance(){
			return balance;
		}
		public void withdraw(int mount){
			lock.lock();//Acqurie the lock
			try{
				while(balance<mount){
					System.out.println("\t\t\tWait for a deposit");
					newDeposit.await();
				}
				balance -=mount; 
				System.out.println("\t\t\tWithdraw "+mount+"\t\t\t\t\t"+getBalance());
			}catch(InterruptedException e){
				
			}finally{
				lock.unlock();
			}
		}
		public void depsoit(int mount){
			lock.lock();
			try{
				balance+=mount;
				System.out.println("Deposit "+mount+"\t\t\t\t\t\t\t\t"+getBalance());
				newDeposit.signalAll();
			}finally{
				lock.unlock();
			}
		}
	}
	//Task for deposit account;
	private static class DepositTask implements Runnable{

		@Override
		public void run() {
			// TODO Auto-generated method stub
			
			try{
				while(true){
					account.depsoit((int)(Math.random()*10)+1);
					Thread.sleep(1000);
				}
				
			}catch(InterruptedException e){
				
			}
			
			
		}
		
	}
	//Task for withdraw account
	private static class WithdrawTask implements Runnable{

		@Override
		public void run() {
			// TODO Auto-generated method stub
			try{
				while(true){
					account.withdraw((int)(Math.random()*10)+1);
					Thread.sleep(1000);
				}
			}catch(InterruptedException e){
				
			}
		}
		
	}
}



条件锁其实就是一个普通的锁加上了一个条件,如下面两行代码
//create a new lockprivate static Lock lock = new ReentrantLock();
//craete a conditionprivate static Condition newDeposit = lock.newCondition();
,重要的不是表象,是为什么需要这个条件锁,假设你有一个银行账户,密码你和你老婆都知道,你负责存钱,你老婆负责取钱,对存钱和取钱的代码都加了锁,所以是可以同步的。诶,平常存啊取的都挺好的,结果你俩矛盾了,你不去存钱,诶银行发现你老婆仍然可以取,而且透支了,你愿意不?银行愿意不?当然不愿意,也许你马上想到了,诶,我可以在取钱的时候加个条件去判断下,如果够取,那就让这个线程来取钱,否则呢?关键是这个否则呢?把这个线程干掉?不人道吧,让人家自己过N年后来取?这也不人道啊,评啥不是你通知人家老公存钱了,老婆过来看看,看够取不?诶,这个条件锁他就是这个为别人考虑的东西,你老婆一旦发现钱不够取了,他就打电话给你,嘿,小伙子,快点存钱,你说我有事,等会在存,等了很久,你存了一点,好,你在打电话给她,说,你可以去取取看,看过不,不够在打电话给我,够了直接取了就是
分享到:
评论

相关推荐

    JavaLock与Condition的理解Reentran

    JavaLock与Condition的理解ReentrantLock锁的简单使用技巧共5页.pdf.zip

    java中的Lock类和Condition类.docx

    在jdk1.5以后,JAVA提供了Lock类来实现和synchronized一样的功能,并且还提供了Condition来显示线程间通信。 Lock类是Java类来提供的功能,丰富的api使得Lock类的同步功能比synchronized的同步更强大。本文章的所有...

    生产者-消费者(lock和condition).zip

    通过java语言编写的生产者消费者,实现方法为lock类和condition类的配合完成。

    java 锁 Lock接口详解.docx

    Condition 接口描述了可能会与锁有关联的条件变量。这些变量在用法上与使用 ...需要特别指出的是,单个 Lock 可能与多个 Condition 对象关联。为了避免兼容性问题,Condition 方法的名称与对应的 Object 版本中的不同。

    Java多线程中ReentrantLock与Condition详解

    主要介绍了Java多线程中ReentrantLock与Condition详解,需要的朋友可以参考下

    Java学习源码Java多线程的代码

    在char04包里放置了Java中Lock类的知识的代码,内容如下: Lock类 Lock类其他功能 Condition类 Condition类其他功能 读写锁 在char05包里放置了生产者/消费者的知识的代码,内容如下: 一对一 生产者/消费...

    56.Lock-ReentranLock-使用多个Condition实现通知部分线程.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    Lock锁的底层原理完整版

    此外,Lock接口还有一个带条件的锁——Condition接口的实现类ReentrantLock。这种带条件的锁使得线程可以在一定条件下挂起等待,直到其它线程唤醒它。 在实际使用场景中,例如多个用户同时操作一个银行账户的情况,...

    java 并发编程 多线程

    java 并发 编程 多线程 concurrent lock condition executorserice executor java.util.curcurrent.

    java多线程实现生产者和消费者

    java多线程实现生产者和消费者 ,4种实现方式,分别为synchronizated,condition和lock,信号量,阻塞队列

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

    11.2.1 lock、readwritelock与condition 349 11.2.2 使用executor 357 11.2.3 并行collection简介 370 11.3 重点复习 373 11.4 课后练习 375 chapter12 通用api 377 12.1 日志 378 12.1.1 日志api简介...

    Java 7并发编程实战手册

    2.8 在锁中使用多条件(Multiple Condition) 69 第3章 线程同步辅助类 77 3.1 简介 77 3.2 资源的并发访问控制 78 3.3 资源的多副本的并发访问控制 83 3.4 等待多个并发事件的完成 87 3.5 在集合...

    Java JDK实例宝典

    14 线程——条件Condition 16. 15 线程——Semaphore 16. 16 线程——CountDownLatch 16. 17 线程——Cycli Barrier 16. 18 线程——Exchanger 16. 19 线程——BlockingQueue 第17章 Java...

    locks框架:接口.pdf

    这份资源旨在介绍 Java Locks 框架中的 Lock 接口及其相关内容。Lock 接口是 Locks 框架的核心,提供了更加灵活和可控的线程同步机制,用于替代传统的 synchronized 关键字。 Lock 接口概述: 简要介绍 Lock 接口,...

    Java并发编程原理与实战

    Lock接口认识与使用.mp4 手动实现一个可重入锁.mp4 AbstractQueuedSynchronizer(AQS)详解.mp4 使用AQS重写自己的锁.mp4 重入锁原理与演示.mp4 读写锁认识与原理.mp4 细读ReentrantReadWriteLock源码.mp4 ...

    JAVA高质量并发详解,多线程并发深入讲解

    接着,深入讲解了Java并发编程的核心API,如synchronized关键字、Lock接口、Condition接口、Semaphore等,帮助读者掌握Java并发编程的基本工具和方法。 除了基础知识和API的讲解,本书还重点介绍了Java并发编程的...

    带你看看Java-AQS同步器 源码解读四 条件队列Condition上

    Java-AQS同步器 源码解读-条件队列Condition前文为什么需要条件队列Conditon Queue举个小例子分析怎么使用条件队列写个小DemoJDK中是怎么使用的Lock和ConditionLockConditionSync-Queue和Conditian-QueueAQS ...

    基础技术部牛路《Java多线程入阶分享》纯干货

    4.线程间通信:lock、condition、wait、notify、notifyAll 5.Lock-free:atomic、concurrentMap.putIfAbsent、CopyOnWriteArrayList 6.关于锁的经验介绍 7.并发流程控制手段:CountDownLatch、Barrier 8.定时器:...

    龙果java并发编程完整视频

    第20节Lock接口认识与使用00:19:54分钟 | 第21节手动实现一个可重入锁00:26:31分钟 | 第22节AbstractQueuedSynchronizer(AQS)详解00:49:04分钟 | 第23节使用AQS重写自己的锁00:31:04分钟 | 第24节重入锁原理与...

Global site tag (gtag.js) - Google Analytics