`

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中的ReentrantLock(可重入锁)以及与其紧密相关的Condition接口,帮助你理解它们的工作原理和应用场景。 **一、ReentrantLock可重入锁** ReentrantLock是Java.util.concurrent.locks包下的...

    java中的Lock类和Condition类.docx

    Java中的Lock类与Condition类是Java并发编程的重要组成部分,它们为多线程环境下的同步提供了更为灵活和强大的控制。在JDK 1.5及之后的版本中,Lock类作为替代synchronized关键字的一种方式出现,提供了更精细的锁...

    生产者消费者Java—LOCK机制

    为了确保线程安全和有效率的数据交换,Java提供了多种同步机制,其中包括Lock接口及其实现,如ReentrantLock。本项目通过Lock机制实现了生产者-消费者的解决方案。 Lock接口是Java并发库(java.util.concurrent....

    java 锁 Lock接口详解.docx

    在Java 1.5版本后,引入了`java.util.concurrent.locks`包,其中的`Lock`接口作为同步机制的新选择,弥补了`synchronized`关键字的一些局限性。下面将详细解释`Lock`接口以及与`synchronized`的区别。 `Lock`接口是...

    Java concurrency之Condition条件_动力节点Java学院整理

    在Java并发编程中,`Condition`接口是Java并发包(java.util.concurrent)中的一个重要组成部分,它提供了比`synchronized`关键字更为精细的线程同步和唤醒机制。`Condition`允许我们创建多个独立的等待队列,每个...

    Java多线程中ReentrantLock与Condition详解

    Java多线程中ReentrantLock与Condition详解 ReentrantLock是Java多线程中一种高级的锁机制,它实现了Lock接口,提供了与synchronized相同的并发性和内存语义,但添加了一些特性,如锁投票、定时锁等候和可中断锁...

    Java多线程之ReentrantLock与Condition - 平凡希 - 博客园1

    Java中的`ReentrantLock`是Java并发包`java.util.concurrent.locks`中的一个高级锁机制,它是可重入的互斥锁,具有与`synchronized`关键字相似的同步性,但提供了更多的灵活性和控制功能。本篇文章将深入探讨`...

    java Lock接口详解及实例代码

    Java Lock接口是Java并发编程中一个重要的组成部分,它提供了一种更为灵活的锁机制,相比传统的`synchronized`关键字,Lock接口允许我们进行更细粒度的控制,包括可中断的锁等待、尝试获取锁以及定时等待等。...

    Java基于Lock的生产者消费者模型示例

    Java中基于Lock的生产者消费者模型是使用Lock和Condition来实现线程同步和通信的。 在本示例中,我们使用了ReentrantLock和Condition来实现生产者消费者模型。ReentrantLock是Java中的一种可重入锁,它可以多次锁定...

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

    在这个场景中,"生产者-消费者(lock和condition).zip"的文件内容可能包含一个使用Java语言实现的示例,它利用了`java.util.concurrent.locks.Lock`接口和`Condition`接口来解决这个问题。 `Lock`接口是Java并发库...

    Java编程中实现Condition控制线程通信

    Java中的Lock接口及其实现,如ReentrantLock,提供了更高级的线程通信机制,其中包括Condition接口。 Condition接口是Java并发包java.util.concurrent.locks的一部分,它允许我们创建特定于锁的等待集合。相比于...

    Java并发编程(20)并发新特性-Lock锁和条件变量(

    本资源主要探讨了Java并发的新特性,特别是Lock锁和条件变量的使用。下面将详细阐述这两个概念以及如何在实际编程中应用它们。 Lock锁是Java并发库中的一个核心组件,位于java.util.concurrent.locks包下。相比传统...

    Java使用Condition控制线程通信的方法实例详解

    Java 中,Condition 类是 Lock 接口的一个补充,它提供了一种机制来让线程等待某个条件的满足,然后继续执行。Condition 将同步监视锁方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与...

    Java学习资料-详解Condition的await和signal等待/通知机制

    在Java多线程编程中,`Condition`是Java并发包`java.util.concurrent.locks`中的一个接口,它提供了比`Object`类中的`wait()`、`notify()`和`notifyAll()`更加灵活和强大的线程间通信机制。`Condition`与`Lock`配合...

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

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

    Java多线程中Lock锁的使用总结

    Java多线程中Lock锁的使用总结 Java多线程中Lock锁的使用总结主要介绍了Java多线程中Lock锁的使用总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值。 知识点1: Java多线程中的...

Global site tag (gtag.js) - Google Analytics