`
yxx676229549
  • 浏览: 73901 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

使用显式的Lock和Condition

 
阅读更多

package star20110715;

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 WaxOMatic2 {
	public static void main(String[] args) throws InterruptedException{
		Car car = new Car();
		ExecutorService executorService = Executors.newCachedThreadPool();
		executorService.execute(new waxOn(car));
		executorService.execute(new Buffer(car));
		TimeUnit.SECONDS.sleep(30);
		executorService.shutdownNow();
	}
}

class Car{
	private Lock lock = new ReentrantLock();
	private Condition condition = lock.newCondition();
	private boolean waxOn = false;
	
	public void waxed(){
		lock.lock();
		try {
				waxOn = true;
				System.err.println("正在打蜡");
				condition.signalAll();
		} finally{
			lock.unlock();
		}
	}
	
	public void buffered(){
		lock.lock();
		try {
				waxOn = false;
				System.err.println("正在抛光");
				condition.signalAll();
		} finally{
			lock.unlock();
		}
	}
	
	public void waitWax() throws InterruptedException{
		lock.lock();
		try {
			while(waxOn == false){
				condition.await();
			}
		} finally{
			lock.unlock();
		}
	}
	
	//如果车子现在已经打蜡了,那么车子现在就要等待啊。
	public void waitBuffer() throws InterruptedException{
		lock.lock();
		try {
			while(waxOn == true){
				condition.await();
			}
		} finally{
			lock.unlock();
		}
	}
}

class waxOn implements Runnable{
	private Car car;
	public waxOn(Car car) {
		this.car = car;
	}
	@Override
	public void run() {
		try {
			while(!Thread.interrupted()){
				System.out.println("开始打蜡");
				car.waxed();
				TimeUnit.SECONDS.sleep(3);
				car.waitBuffer();
			}
		} catch (InterruptedException e) {
			System.out.println("打蜡结束");
		}
	}
	
}

class Buffer implements Runnable{
	private Car car;
	public Buffer(Car car) {
		this.car = car;
	}
	@Override
	public void run() {
		try {
			while(!Thread.interrupted()){
				car.waitWax();
				System.out.println("开始抛光");
				car.buffered();
				TimeUnit.SECONDS.sleep(3);
			}
		} catch (InterruptedException e) {
			System.out.println("抛光结束");
		}
	}
	
}

 
分享到:
评论

相关推荐

    java中的Lock类和Condition类.docx

    - 使用Lock类时,我们需要显式调用`lock()`方法获取锁,`unlock()`方法释放锁,这使得我们可以将锁操作与其他业务逻辑分开,增加了代码的可读性和可维护性。 - Lock类的一个显著优点是它可以支持多个条件变量,即...

    笔记-4、显式锁和AQS1

    1. **代码简洁性**:synchronized关键字的使用更为简洁,只需将其应用于方法或代码块,而Lock接口需要显式地获取和释放锁,代码相对复杂。 2. **中断性**:synchronized无法中断正在等待锁的线程,而Lock接口提供了`...

    笔记-4、显式锁和AQS(1)1

    为了提供更灵活的锁控制,Java引入了Lock接口,它是显式锁的代表,允许我们执行更复杂的操作,如中断锁获取、超时获取和尝试获取等。ReentrantLock是Lock接口的一个具体实现,它支持可重入性,即一个线程可以多次...

    第四节(Lock关键字用法)

    使用`Lock`接口的一个重要优点是可以显式地获取和释放锁,这使得代码更具有可读性和可控性。例如,我们可以使用`try-with-resources`语句确保锁在使用完毕后总是被正确释放: ```java Lock lock = ...; // 初始化...

    Java并发显式锁和显式条件队列

    **显式条件队列**,通常与显式锁配合使用,如`java.util.concurrent.locks.Condition`接口。条件队列允许线程等待特定条件满足后再继续执行,而不是简单地等待锁的释放。条件队列的线程等待和唤醒是通过`Condition`...

    Synchronized与Lock

    而Lock接口(如ReentrantLock)提供了更高级的同步控制,具有更高的灵活性和控制性,但使用起来相对复杂。选择哪种机制取决于具体的应用场景和需求,如性能、可读性、可维护性等因素。在理解和掌握这两种同步方式的...

    locktest.zip

    2. **非块结构**:使用Lock时,我们不需要像`synchronized`那样包围整个代码块,而是需要在适当的地方显式调用`lock()`和`unlock()`方法。 3. **可中断性**:Lock的`lockInterruptibly()`方法允许在等待锁时响应中断...

    Oracle入门--Oracle游标使用

    显式游标需要在DECLARE部分声明,并通过OPEN、FETCH、CLOSE等语句来管理和使用。以下是一个基本的显式游标示例: ```sql DECLARE cursor_name CURSOR FOR SELECT column1, column2 FROM table_name WHERE ...

    wait,notify等线程知识.pdf

    `Lock` 接口中定义了 `lock()` 和 `unlock()` 方法来显式地控制锁的获取和释放,还提供了 `tryLock()` 方法尝试获取锁而不阻塞线程。 **示例代码:** ```java Lock lock = new ReentrantLock(); lock.lock(); try {...

    深入理解java内置锁(synchronized)和显式锁(ReentrantLock)

    内置锁的使用非常方便,不需要显式的获取和释放,任何一个对象都能作为一把内置锁。内置锁的使用可以解决大部分的同步场景。但是,内置锁也存在一些局限性,例如无法设置超时时间、无法中断线程等。 显式锁...

    java常用锁使用demo工程

    - **条件变量(Condition)**:Lock接口提供了一个Condition接口,可以创建多个条件变量,比`synchronized`的wait/notify机制更灵活。 3. 其他同步工具类: - **Semaphore**:信号量,可以控制同时访问特定资源的...

    Java并发编程实践-07章-显示锁1

    6. `newCondition()`:创建一个与该`Lock`实例相关联的`Condition`对象,用于线程间的通信和同步。 `ReentrantLock`是`Lock`接口的实现,它具有可重入性,意味着一个线程可以多次获取同一锁,只要该线程未释放所有...

    关于synchronized、Lock的深入理解

    1. **使用方式**:`synchronized`是隐式同步,无需手动释放,而`Lock`是显式同步,需手动调用`lock()`和`unlock()`。 2. **控制能力**:`Lock`提供了更多控制选项,如可中断、可选择公平性、锁分离等。 3. **异常...

    Java并发编程之显式锁机制详解

    6. `Condition newCondition()`: 创建一个条件变量,用于控制线程等待和唤醒,这是Lock接口的重要特性之一。 ReentrantLock是Lock接口的主要实现类,具备可重入性,即线程已经持有了锁,可以再次获取而不被阻塞。这...

    Oracle游标使用大全

    在PL/SQL中,INSERT、UPDATE、DELETE和LOCK TABLE等DML语句与SQL中的语法相同,但可以更方便地结合变量使用。例如,在上面的FIRE_EMPLOYEE过程示例中,先查询然后插入、删除和更新数据。 6. DML语句的结果 DML语句...

    C++跨平台条件变量和互斥锁封装

    2. **锁定和解锁**:使用`lock()`和`unlock()`方法控制互斥锁的获取和释放。在使用条件变量之前,必须先持有互斥锁。 3. **等待和通知**:`wait()`函数会让线程进入等待状态,直到其他线程调用`notify_one()`或`...

    Oracle 游标使用大全

    本文将深入探讨Oracle游标的使用,包括显式和隐式游标,以及它们在DML语句中的应用。 首先,当我们使用SELECT语句在PL/SQL中查询数据时,通常需要结合INTO子句,将查询结果存储到预声明的变量中。例如,`SELECT ...

Global site tag (gtag.js) - Google Analytics