`

使用Condition实现有界缓存

阅读更多
       
import java.util.concurrent.locks.*;

import net.jcip.annotations.*;

/**
 * ConditionBoundedBuffer
 * <p/>
 * Bounded buffer using explicit condition variables
 * 
 * @author Brian Goetz and Tim Peierls
 */

@ThreadSafe
public class ConditionBoundedBuffer<T>
{
    protected final Lock lock = new ReentrantLock();
    // CONDITION PREDICATE: notFull (count < items.length)
    private final Condition notFull = lock.newCondition();
    // CONDITION PREDICATE: notEmpty (count > 0)
    private final Condition notEmpty = lock.newCondition();
    private static final int BUFFER_SIZE = 100;
    @SuppressWarnings("unchecked")
    @GuardedBy("lock")
    private final T[] items = (T[]) new Object[BUFFER_SIZE];
    @GuardedBy("lock")
    private int tail, head, count;

    // BLOCKS-UNTIL: notFull
    public void put(T x) throws InterruptedException
    {
        lock.lock();
        try
        {
            while (count == items.length)
                notFull.await();
            items[tail] = x;
            if (++tail == items.length)
                tail = 0;
            ++count;
            notEmpty.signal();
        }
        finally
        {
            lock.unlock();
        }
    }

    // BLOCKS-UNTIL: notEmpty
    public T take() throws InterruptedException
    {
        lock.lock();
        try
        {
            while (count == 0)
                notEmpty.await();
            T x = items[head];
            items[head] = null;
            if (++head == items.length)
                head = 0;
            --count;
            notFull.signal();
            return x;
        }
        finally
        {
            lock.unlock();
        }
    }
}
分享到:
评论

相关推荐

    spring缓存机制-根据condition加入缓存(三)

    在Spring框架中,缓存机制是一项重要的功能,它能够提高应用程序的性能,减少对数据库的访问,从而降低系统负载。本篇文章将详细讲解如何利用...理解并熟练掌握这一特性,有助于在实际项目中实现高效、精准的缓存管理。

    Spring实战之缓存使用condition操作示例

    Spring实战之缓存使用condition操作示例 Spring框架中缓存使用condition操作是指在应用程序中使用缓存机制来提高系统性能和可扩展性。缓存机制可以将频繁访问的数据存储在内存中,以便快速地访问和 Retrieval。在...

    springboot 使用spring cache缓存 和 缓存数据落地到redis

    【Spring Boot 使用 Spring Cache 缓存与数据落地到 Redis】\n\n在Spring Boot应用中,Spring Cache是一个强大的工具,可以极大地提升应用的性能,通过缓存非计算性或者昂贵的计算结果。Spring Cache抽象了缓存管理...

    3.2、接3.1自定义缓存策略以及删除缓存Cacheable 参数1

    实战应用中,我们通常会结合使用这些注解来实现缓存策略。例如,在`PersonServiceImpl`中,我们可以为`findById`方法添加`@Cacheable`注解,然后在更新或删除操作后,使用`@CacheEvict`清除对应的缓存项,确保数据的...

    35.[视频] Spring Boot集成Redis实现缓存机制【从零开始学Spring Boot】

    在本节中,我们将深入探讨如何使用Spring Boot集成Redis来实现高效的缓存机制。Spring Boot是Java开发领域中一个流行的微服务框架,它简化了设置和配置过程,使得开发人员可以快速启动项目。Redis则是一种高性能的...

    Java条件变量的深度应用:使用Condition接口实现同步等待

    Java通过java.util.concurrent.locks包中的Condition接口提供了条件变量的实现。本文将详细介绍Condition接口的工作原理、使用方法以及如何在实际项目中应用它。 Condition接口是Java并发编程中实现等待/通知模式的...

    spring-cache(通过key值更新缓存)

    Spring Cache是一个抽象层,它允许开发者在不关注具体缓存实现的情况下,轻松地在应用程序中添加缓存功能。本篇文章将详细探讨如何通过key值更新Spring Cache中的指定缓存,以及相关的缓存管理策略。 首先,让我们...

    spring缓存机制-入门实例

    本篇文章将深入探讨Spring缓存机制的基础知识,并通过一个入门实例来阐述其工作原理和使用方法。 Spring缓存抽象是自Spring 3.1版本引入的,它提供了一个统一的API,支持多种缓存解决方案,如EhCache、Guava Cache...

    缓存变量的巧妙使用:CMake中缓存变量的深度指南

    ### 缓存变量的巧妙使用:CMake 中缓存变量的深度指南 #### 一、缓存变量简介 缓存变量是 CMake 中一个非常重要的概念。...理解并熟练掌握缓存变量的使用方法,对于任何 CMake 用户来说都是非常有价值的技能。

    condition_variable源码以及详细分析.docx

    在这篇文章中,我们将详细介绍 Condition_Variable 的使用方法和源码实现。 Condition_Variable 的基本概念 Condition_Variable 是一种同步机制,允许线程在某个条件下等待或通知其他线程。它通常与互斥锁(Mutex...

    c++11 实现的阻塞队列

    对于有界阻塞队列,我们需要添加一个条件变量来判断队列是否满。当队列满时,生产者线程将被阻塞,直到消费者线程将数据从队列中取出。 在给定的代码中,我们使用 std::mutex、std::condition_variable 和 std::...

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

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

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

    使用Condition实现同步的基本思路是:线程在执行前需要先获取条件变量。一旦线程获取了条件变量,它将对某个条件进行检查。如果条件不成立,则线程调用wait()方法挂起等待。当另一个线程执行时,如果改变了条件的值...

    java编程之Caffeine缓存

    @Cacheable:(cacheNames/value缓存名字,key支持sqel,keyGenerator生成器,指定缓存器,condition支持sqel的缓存条件,unless为true时候不缓存,sync是否异步)注意类内部的调用不触发缓存,所以一定是service...

    Python线程协作threading.Condition实现过程解析

    本文将深入解析`threading.Condition`的工作原理和实现过程,并通过一个简单的男女对话示例来阐述其使用方法。 `threading.Condition`是基于`threading.Lock`(通常是`RLock`,递归锁)的类,它提供了额外的功能,...

    Spring Cache 复合缓存管理器

    - 除了基本的缓存策略,Spring还支持基于时间、大小、引用计数等条件的过期策略,可以通过`@CacheEvict`注解的`condition`和`unless`属性实现。 - 还可以自定义缓存的key生成策略,通过`keyGenerator`属性指定...

    浅析SpringCache缓存1

    4. **缓存条件**:`@Cacheable` 和 `@CacheEvict` 注解都支持 `condition` 参数,可以使用 SpEL 表达式来定义缓存的条件。例如,只有满足特定条件时,方法的结果才会被缓存或清除。 5. **缓存超时**:可以通过 `@...

    Spring缓存

    3. **启用Spring Cache**:在Spring的配置文件中启用缓存管理,并指定使用的缓存实现为Ehcache。 4. **配置Bean**:定义一个`CacheManager` Bean,它会读取Ehcache配置并初始化缓存。 5. **使用注解**:在需要缓存的...

    环形缓存存储器功能测试

    为了保证数据一致性,通常需要使用互斥锁(Mutex)、信号量(Semaphore)或条件变量(Condition Variable)等同步原语来防止数据竞争。 5. **效率优化**:在实现时,可以通过位运算提高存取速度。例如,用位移操作...

    Spring Redis缓存实例

    3. **缓存刷新策略**: 设置缓存的过期时间,或者使用`@CacheEvict`的`condition`和`unless`属性实现条件式缓存清理。 4. **分布式锁**: 使用Redis的Set命令实现分布式锁,保证多线程、多节点环境下的数据一致性。 ...

Global site tag (gtag.js) - Google Analytics