Java ReEntrantLock 之 Condition条件(Java代码实战-002)

import java.util.LinkedList;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * ConditionTest
 * 一个测试类,用Condition实现的生产者消费者问题
 */
public class ConditionTest {
    /* 定义一个容器(链表、队列) */
    private LinkedList<String> buffer;
    /* 容器可以容纳元素的最大数量,通过构造函数来初始化 */
    private int maxSize;
    private Lock lock;
    private Condition fullCondition;
    private Condition notFullCondition;

    ConditionTest(int maxSize) {
        this.maxSize = maxSize;
        buffer = new LinkedList<String>();
        lock = new ReentrantLock();
        fullCondition = lock.newCondition();
        notFullCondition = lock.newCondition();
    }

    /**
     * 向容器中放入Element
     */
    public void set(String string) throws InterruptedException {
        // 获取锁
        lock.lock();
        try {
            while (maxSize == buffer.size()) {
                // 满了,添加的线程进入等待状态
                notFullCondition.await();
            }
            buffer.add(string);

            // 容器不为空时,则给等待的读取的线程发送信号以便唤醒这些线程进行读取
            fullCondition.signal();
        } finally {
            lock.unlock();
        }
    }

    /**
     * 从容器中获取Element
     */
    public String get() throws InterruptedException {
        String string;
        lock.lock();
        try {
            while (buffer.size() == 0) {
                // 如果容器为空,则读取的线程进入等待状态
                fullCondition.await();
            }
            string = buffer.poll();

            // 给写入的线程发送信号以便唤醒这些线程来往容器中写入
            notFullCondition.signal();
        } finally {
            lock.unlock();
        }
        return string;
    }
}

原文地址:https://www.cnblogs.com/frankyou/p/9054879.html

时间: 2024-10-02 20:24:01

Java ReEntrantLock 之 Condition条件(Java代码实战-002)的相关文章

Java开发的基础条件:

------------Java开发的基础条件:Java相关的基础+对编程的自己的理解+调试代码+自己的坚持 一定要谦逊,不人云亦云,不去妄言某一门语言或技术好或坏!不是哪门技术有问题,而是(不会用才是问题,) 如何夯实(Java)编程基础,并深入学习和提高?多写,多用,多想.纸上写来终觉浅,唯有编码才是真.你觉得你的基础薄弱!那么你就应该知道你的哪些地方薄弱,什么对你现在 是最重要的,一口气吃不成个大胖子,21天你也精通不了一门编程语言, 基础知识真的很重要,很重要,很重要,重要的事情说三遍.

【Java多线程通信】syncrhoized下wait()/notify()与ReentrantLock下condition的用法比较

转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6556925.html  一:syncrhoized使用同一把锁的多个线程用通信实现执行顺序的调度 我们知道,使用syncrhoized关键字修饰一个代码块.一个方式时,在代码块.方法执行完毕之前是不会释放掉所持有的锁的,在执行期间,其他申请这个锁的线程只能阻塞等待.这些等待的线程被安排在一个等待队列中. 现在,由于某种原因,在当前同步代码块A中需要另一个同步代码块B先执行完,然后A才能继续进行下去.而同步代

Java多线程之ReentrantLock与Condition

一.ReentrantLock 类 1.1 什么是reentrantlock java.util.concurrent.lock 中的 Lock 框架是锁定的一个抽象,它允许把锁定的实现作为 Java 类,而不是作为语言的特性来实现.这就为 Lock 的多种实现留下了空间,各种实现可能有不同的调度算法.性能特性或者锁定语义. ReentrantLock 类实现了 Lock ,它拥有与 synchronized 相同的并发性和内存语义,但是添加了类似锁投票.定时锁等候和可中断锁等候的一些特性.此外

java 多线程之ReentrantLock与condition

参考链接:https://blog.csdn.net/vernonzheng/article/details/8288251 ReentrantLock 类 1.1 什么是reentrantlock java.util.concurrent.lock 中的 Lock 框架是锁定的一个抽象,它允许把锁定的实现作为 Java 类,而不是作为语言的特性来实现.这就为 Lock 的多种实现留下了空间,各种实现可能有不同的调度算法.性能特性或者锁定语义. ReentrantLock 类实现了 Lock ,

java 多线程 19: ReentrantLock 与 Condition

ReentrantLock ReentrantLock,一个可重入的互斥锁,它具有与使用synchronized方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大. ReentrantLock基本用法 先来看一下ReentrantLock的基本用法: public class ThreadDomain38 { private Lock lock = new ReentrantLock(); public void testMethod() { try { lock.lock()

java ReentrantLock结合条件队列 实现生产者-消费者模式

1 package reentrantlock; 2 3 import java.util.ArrayList; 4 5 public class ProviderAndConsumerTest { 6 7 static ProviderAndConsumer providerAndConsumer = new ProviderAndConsumer(); 8 9 public static void main(String[] args) throws InterruptedException

Java秒杀系统实战系列~商品秒杀代码实战

摘要: 本篇博文是"Java秒杀系统实战系列文章"的第六篇,本篇博文我们将进入整个秒杀系统核心功能模块的代码开发,即"商品秒杀"功能模块的代码实战. 内容: "商品秒杀"功能模块是建立在"商品详情"功能模块的基础之上,对于这一功能模块而言,其主要的核心流程在于:前端发起抢购请求,该请求将携带着一些请求数据:待秒杀Id跟当前用户Id等数据:后端接口在接收到请求之后,将执行一系列的判断与秒杀处理逻辑,最终将处理结果返回给到前端.

Java框架JSON-RPC项目demo代码实战

原创整理不易,转载请注明出处:Java框架JSON-RPC项目demo代码实战 代码下载地址:http://www.zuidaima.com/share/1781535155162112.htm 一.JSON-RPC-Java简介 JSON-RPC-Java是一个用Java来实现动态JSON-RPC的框架. 利用它内置的一个轻级量JSON-RPC JavaScripIt客户端,可以让你透明地在JavaScript中调用Java代码.JSON-RPC-Java可运行在Servlet容器中如Tomc

Java 线程池之FixedThreadPool(Java代码实战-003)

import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadPoolExecutor; /** * FixThreadPoolExecutorTest 定义一个可重用的固线程数的线程池 */ public class FixThreadPoolExecutorTest { public static void main(S