


Explication détaillée de l'implémentation du cache limité dans la programmation simultanée JAVA
Implémentation du cache limité dans la programmation simultanée JAVA
1. Classe de base du cache limité
package cn.xf.cp.ch14; /** * *功能:有界缓存实现基类 *时间:下午2:20:00 *文件:BaseBoundedBuffer.java *@author Administrator * * @param <V> */ public class BaseBoundedBuffer<V> { private final V[] buf; private int tail; private int head; private int count; public BaseBoundedBuffer(int capacity) { //初始化数组 this.buf = (V[]) new Object[capacity]; } //放入一个数据,final方法无法被重写 protected synchronized final void doPut(V v) { buf[tail] = v; if(++tail == buf.length) { tail = 0; } //插入一个方法,总量++ ++count; } /** * 取出一个数据 * @return */ protected synchronized final V doTake() { V v = buf[head]; buf[head] = null; if(++head == buf.length) { head = 0; } --count; return v; } //通过对count的判断,来确定数组是否是满的 public synchronized final boolean isFull() { return count == buf.length; } public synchronized final boolean isEmpty() { return count == 0; } }
2. exécution des opérations
package cn.xf.cp.ch14; /** * *功能:对插入和获取元素操作进行先行检查,然后执行操作,校验不通过不予操作 *时间:下午2:33:41 *文件:GrumpyBoundedBuffer.java *@author Administrator * * @param <V> */ public class GrumpyBoundedBuffer<V> extends BaseBoundedBuffer<V> { public GrumpyBoundedBuffer(int size) { super(size); } public synchronized void put(V v) throws Exception { //如果是满的队列,就无法插入新的元素 if(this.isFull()) { throw new Exception("队列超出"); } this.doPut(v); } //同理,队列为空的就无法取出新的元素 public synchronized V take() throws Exception { if(this.isEmpty()) { throw new Exception("队列中无元素"); } return this.doTake(); } }
3. Implémenter un blocage simple par interrogation et mise en veille
package cn.xf.cp.ch14; /** * *功能:通过轮询与休眠来实现简单的阻塞 *时间:下午2:55:54 *文件:SleepyBoundedBuffer.java *@author Administrator * * @param <V> */ public class SleepyBoundedBuffer<V> extends BaseBoundedBuffer<V> { //2s private static final long SLEEP_GRANULARITY = 2000; public SleepyBoundedBuffer(int capacity) { super(capacity); } //放入队列的时候 public void put(V v) throws InterruptedException { while(true) { //这里不对循环上锁,不然这个锁就无法释放了,不对休眠上锁,休眠上锁,在休眠的时候别人也无法操作,永远都不可能有元素出去 synchronized (this) { //如果队列不是满的,那么就放入元素 if(!this.isFull()) { this.doPut(v); return; } } //否则休眠,退出cpu占用 Thread.sleep(SLEEP_GRANULARITY); } } public V take() throws InterruptedException { while(true) { //这里不对循环上锁,不然这个锁就无法释放了,不对休眠上锁,休眠上锁,在休眠的时候别人也无法操作,永远都不可能有新的元素进来 synchronized(this) { //如果数组部位空,那么就可以取出数据 if(!this.isEmpty()) { return this.doTake(); } //如果队列为空,休眠几秒再试 } Thread.sleep(SLEEP_GRANULARITY); } } }
4. File d'attente conditionnelle
package cn.xf.cp.ch14; /** * *功能:使用条件队列 *时间:下午3:32:04 *文件:BoundedBuffer.java *@author Administrator * * @param <V> */ public class BoundedBuffer<V> extends BaseBoundedBuffer<V> { public BoundedBuffer(int capacity) { super(capacity); } /** * 放入数据元素 * @param v * @throws InterruptedException */ public synchronized void put(V v) throws InterruptedException { while(this.isFull()) { //这里挂起程序,会释放锁 this.wait(); } //如果队列不为满的,那么程序被唤醒之后从新获取锁 this.doPut(v); //执行结束,唤醒其他队列 this.notifyAll(); } public synchronized V take() throws InterruptedException { while(this.isEmpty()) { this.wait(); } V v = this.doTake(); this.notifyAll(); return v; } }
Merci d'avoir lu, j'espère que cela pourra aider tout le monde, merci pour votre soutien à ce site !
Pour des explications plus détaillées sur l'implémentation du cache limité dans la programmation simultanée JAVA, veuillez faire attention au site Web PHP chinois !

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Dépannage et solutions au logiciel de sécurité de l'entreprise qui fait que certaines applications ne fonctionnent pas correctement. De nombreuses entreprises déploieront des logiciels de sécurité afin d'assurer la sécurité des réseaux internes. ...

Le traitement de la cartographie des champs dans l'amarrage du système rencontre souvent un problème difficile lors de l'exécution d'amarrage du système: comment cartographier efficacement les champs d'interface du système a ...

Lorsque vous utilisez MyBatis-Plus ou d'autres cadres ORM pour les opérations de base de données, il est souvent nécessaire de construire des conditions de requête en fonction du nom d'attribut de la classe d'entité. Si vous manuellement à chaque fois ...

Commencez le printemps à l'aide de la version IntelliJideaultimate ...

Solutions pour convertir les noms en nombres pour implémenter le tri dans de nombreux scénarios d'applications, les utilisateurs peuvent avoir besoin de trier en groupe, en particulier en un ...

Lorsque vous utilisez TkMyBatis pour les requêtes de base de données, comment obtenir gracieusement les noms de variables de classe d'entité pour créer des conditions de requête est un problème courant. Cet article épinglera ...

Conversion des objets et des tableaux Java: Discussion approfondie des risques et des méthodes correctes de la conversion de type de distribution De nombreux débutants Java rencontreront la conversion d'un objet en un tableau ...

Comment la solution de mise en cache Redis réalise-t-elle les exigences de la liste de classement des produits? Pendant le processus de développement, nous devons souvent faire face aux exigences des classements, comme l'affichage d'un ...
