`

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

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

    java中的Lock类和Condition类.docx

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

    JavaLock与Condition的理解Reentran

    本文将深入探讨JavaLock中的ReentrantLock(可重入锁)以及与其紧密相关的Condition接口,帮助你理解它们的工作原理和应用场景。 **一、ReentrantLock可重入锁** ReentrantLock是Java.util.concurrent.locks包下的...

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

    使用Lock和Condition,生产者和消费者可以独立地控制何时进入等待状态,何时继续执行。当队列满时,生产者会调用condition.await()等待,直到消费者消费了一些数据并调用condition.signal();同样,当队列空时,消费...

    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 线程池的优势和适用场景...

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

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

    wait,notify等线程知识.pdf

    通过使用wait()、notify()和notifyAll(),或者Lock和Condition,开发者可以控制线程的执行顺序,确保共享资源的安全访问。 7. **死锁和活锁问题**: 使用wait/notify机制时,需要注意死锁和活锁问题。死锁发生在两...

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

    本示例中,我们使用了Lock和Condition来实现生产者消费者模型,避免了使用synchronized关键字的方式,而是使用了Lock和Condition来实现线程同步和通信,提高了程序的性能和可读性。 知识点: * Java中的生产者消费...

    locks框架:接口.pdf

    在实际使用中,Lock和Condition的配合使用可以实现复杂的数据结构,例如生产者-消费者模型中的缓冲区,如示例代码中的BoundedBuffer类。它使用了ReentrantLock来保护共享状态,并通过Condition来控制生产者和消费者...

    Java并发编程解析 | 解析AQS基础同步器的设计与实现

    AQS是Java中解决同步和互斥问题的基础同步器,通过Lock和Condition两个接口来实现管程。Lock用于解决互斥问题,Condition用于解决同步问题。AQS的设计和实现是基于管程技术的,管程是解决同步和互斥问题的有效方法。...

    ConditionVariablesJAVA多线程[定义].pdf

    而Condition接口则代表了一个条件变量,它被绑定到一个Lock对象上,并提供了一系列方法,例如await()、signal()和signalAll(),分别用于挂起当前线程、唤醒一个等待的线程以及唤醒所有等待的线程。 在上述提供的...

    java项目开发总结.docx

    * lock 和 Condition 等同步机制 九、Web 开发 * HttpServlet、doGet、doPost 等 servlet 方法 * HttpServletRequest 和 HttpServletResponse 等 servlet 接口 * request.getParameter()、request.setAttribute() ...

    测试开发面试经验总结.docx

    多线程的实现方式包括继承Thread类和实现Runnable接口,面试中可能还会讨论线程同步和通信的方法,如wait、sleep、notify和notifyAll,以及线程间的共享变量、wait/notify机制、Lock和Condition等。 此外,面试中还...

    nachos实验二 线程与同步

    1. 使用 Thread::Sleep 实现锁机制和条件变量:在这一部分中,需要修改 nachos-3.4/code/threads/synch.h 和 nachos-3.4/code/threads/synch.cc 文件,实现 Lock 和 Condition 类的接口声明和实现。 2. 使用 ...

    Thread基础知识点笔记总结

    Thread 基础知识点笔记总结 Thread 是 Java 中最...传统生产者消费者问题可以用 lock 和 condition 一起控制,用 condition 的 await()和 signal()对生产者和消费者进行等待和唤醒,保证生产一个数据消费一个数据。

    nachos实验报告 3 lab3

    这为构建更复杂的锁机制,如Semaphore、Lock和Condition提供了基础。 **内容二:任务完成情况** 实验3包括了以下几个Exercise: - Exercise1:实现了Semaphore的概念,包括P()和V()操作。P()操作中使用while循环和...

    java面试题150题.docx

    线程和线程同步是多线程编程的核心概念,Java提供了synchronized关键字、wait/notify机制以及更高级的Lock和Condition接口来保证并发安全。集合框架是Java中存储和操作数据的重要工具,包括List、Set、Map等,而迭代...

    Java多线程演示系统.zip

    Java提供了丰富的线程同步机制来防止线程间的数据竞争问题,主要包括synchronized关键字、volatile变量、Lock和Condition接口、CountDownLatch、CyclicBarrier、Semaphore等。synchronized提供互斥访问,保证同一...

Global site tag (gtag.js) - Google Analytics