`

lock和Condition

 
阅读更多
主要相同点:Lock能完成synchronized所实现的所有功能,同时 lock性能上高于synchronized
主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。
另外,Synchronized---对象加锁,Lock---基于栈中的框架,而不是具体的某个对象,只需要在栈里设置锁的开始和结束就行,不用关心大小对象的变化...、

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



public class TestThread{
	
	private final static Lock lock = new ReentrantLock();
    private final static Condition produced = lock.newCondition();
    private final Condition consumed = lock.newCondition();
    boolean available = false;
    static int k=100;
	public static void main(String[] args){
		/*lock.lock();
		try{
			for(int i=3;i>0;i--){
				System.out.println("------"+i+"-----");
				produced.await(3,TimeUnit.SECONDS);
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}finally{
			lock.unlock();
		}*/
		final TestThread t = new TestThread();
		Thread proTh = new Thread(){
				public void run(){
					try {
						t.produce();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			};
		Thread cusTh = new Thread(){
				public void run(){
					try {
						t.consume();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			};
		ExecutorService service = Executors.newCachedThreadPool();

		service.submit(cusTh);
		for(int i=3;i>0;i--){
			service.submit(proTh);
		}
		service.shutdown();
	}
	
	/**
	 * 生产者
	 * @throws InterruptedException
	 */
     public void produce() throws InterruptedException  {

           lock.lock();
           try {
                 /*if(available){
                	// produced.await(); //放弃lock进入睡眠 
                	 System.out.println("-------------");
                	 consumed.signal();
                	 produced.await();
                 }*/
        	   	 System.out.println("-----start------");
        	     //consumed.signal();
            	// produced.await(10,TimeUnit.SECONDS);
        	   	 Thread.sleep(1000);
        	     //consumed.signal(); //发信号唤醒等待这个condition的线程
                 /*生产苹果*/
                 System.out.println("apple produced.");
                 available = true;
                 System.out.println("produce----->k="+k);
 				 k--;
           } finally {
                 lock.unlock();
           }
     }
     /**
      * 消费者
      * @throws InterruptedException
      */
     public synchronized void consume() throws InterruptedException {

           //lock.lock();
          // try {
               /* if(!available){
                	System.out.println("1111111111");
                	produced.signal();
                	consumed.await();//放弃lock进入睡眠
                	 //Thread.sleep(1000);
                 }*/
        	    // consumed.await(5,TimeUnit.SECONDS);
        	   Thread.sleep(5000);
                 /*吃苹果*/
                 System.out.println("apple consumed.");
                 available = false;
                 //produced.signal();//发信号唤醒等待这个condition的线程
                 System.out.println("consume----->k="+k);
 				 k--;
 				/* } finally {
                 lock.unlock();
           }*/

     }      
}
分享到:
评论

相关推荐

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

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

    JavaLock与Condition的理解Reentran

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

    Java中的Runnable接口最全讲义

    6.4 使用Lock和Condition 6.5 使用volatile关键字 7. 线程通信: 7.1 使用wait()和notify()方法 7.2 使用Lock和Condition 8. 线程池: 8.1 线程池的概述 8.2 使用Executor框架创建线程池 8.3 线程池的优势和适用场景...

    java中的Lock类和Condition类.docx

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

    多线程编程的核心思想.doc

    多线程编程的核心思想 多线程编程的核心思想是指在多线程环境下如何实现线程安全、...多线程编程的核心思想是通过 Lock 和 Condition 接口来实现线程安全和同步机制,并使用 AQS 底层实现来实现锁和 Condition 接口。

    C++11中的mutex, lock, condition variable实现分析

    C++11中的各种mutex, lock对象,实际上都是对posix的mutex,condition的封装。不过里面也有很多细节值得学习。  std::mutex  先来看下std::mutex:  包增了一个pthread_mutex_t __m_,很简单,每个函数该干嘛...

    Lock、Condition实现简单的生产者消费者模式示例

    主要介绍了Lock、Condition实现简单的生产者消费者模式示例,需要的朋友可以参考下

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

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

    condition_variable源码以及详细分析.docx

    详细介绍了线程同步条件变量condition_variable的使用和它的源码,涉及到unique_lock, mutex, lock_guard, 虚假唤醒和惊群效应。

    leetcode分类-JavaStudy:Java学习

    Condition 的使用 (划重点) Semaphore 的使用 ReadWriteLock 的使用 (划重点) StampedLock 的使用 CountDownLatch 和 CyclicBarrier 的使用 线程池的使用 (划重点) Future 和 FutureTask 的使用 CompletableFuture ...

    Nachos的线程管理模块升级

    比较实用,是操作系统很好的教辅资料。很详细的讲解。

    Lock锁的底层原理完整版

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

    Java多线程中ReentrantLock与Condition详解

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

    locks框架:接口.pdf

    Condition 条件变量: 介绍 Lock 接口中的 Condition,它可以实现更复杂的线程等待和通知机制。解释如何使用 await、signal 和 signalAll 方法。 通过这份资源,您将获得关于 Locks 框架中 Lock 接口的深入理解,从...

    python多线程高级锁condition简单用法示例

    多线程编程中如果使用Condition对象代替lock, 能够实现在某个事件触发后才处理数据, condition中含有的方法: – wait:线程挂起,收到notify通知后继续运行 – notify:通知其他线程, 解除其它线程的wai状态 – ...

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

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

    Python多线程编程(七):使用Condition实现复杂同步

    Condition被称为条件变量,除了提供与Lock类似的acquire和release方法外,还提供了wait和notify方法。 使用Condition的主要方式为:线程首先acquire一个条件变量,然后判断一些条件。如果条件不满足则wait;如果条件...

    阿里Java并发程序设计教程

    4、线程间的协调手段:lock、condition、wait、notify、notifyAll ☆ ☆ ☆ 5、Lock-free: atomic、concurrentMap.putIfAbsent、CopyOnWriteArrayList ☆ ☆ ☆ 6、关于锁使用的经验介绍 7、并发流程控制手段:...

    java 锁 Lock接口详解.docx

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

Global site tag (gtag.js) - Google Analytics