欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JAVA并發(fā)編程有界緩存的實(shí)現(xiàn)詳解

 更新時(shí)間:2016年12月03日 16:04:47   投稿:lqh  
這篇文章主要介紹了JAVA并發(fā)編程有界緩存的實(shí)現(xiàn)詳解的相關(guān)資料,這里舉例說明如何實(shí)現(xiàn),四種方法一一代碼實(shí)現(xiàn),需要的朋友可以參考下

JAVA并發(fā)編程有界緩存的實(shí)現(xiàn)

1、有界緩存的基類



package cn.xf.cp.ch14;

/**
 * 
 *功能:有界緩存實(shí)現(xiàn)基類
 *時(shí)間:下午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)
  {
    //初始化數(shù)組
    this.buf = (V[]) new Object[capacity];
  }
  
  //放入一個(gè)數(shù)據(jù),final方法無法被重寫
  protected synchronized final void doPut(V v)
  {
    buf[tail] = v;
    if(++tail == buf.length)
    {
      tail = 0;
    }
    //插入一個(gè)方法,總量++
    ++count;
  }
  
  /**
   * 取出一個(gè)數(shù)據(jù)
   * @return
   */
  protected synchronized final V doTake()
  {
    V v = buf[head];
    buf[head] = null;
    if(++head == buf.length)
    {
      head = 0;
    }
    --count;
    return v;
  }
  
  //通過對(duì)count的判斷,來確定數(shù)組是否是滿的
  public synchronized final boolean isFull()
  {
    return count == buf.length;
  }
  
  public synchronized final boolean isEmpty()
  {
    return count == 0;
  }
}

2、判定前提條件再執(zhí)行操作



package cn.xf.cp.ch14;

/**
 * 
 *功能:對(duì)插入和獲取元素操作進(jìn)行先行檢查,然后執(zhí)行操作,校驗(yàn)不通過不予操作
 *時(shí)間:下午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
  {
    //如果是滿的隊(duì)列,就無法插入新的元素
    if(this.isFull())
    {
      throw new Exception("隊(duì)列超出");
    }
    this.doPut(v);
  }
  
  //同理,隊(duì)列為空的就無法取出新的元素
  public synchronized V take() throws Exception
  {
    if(this.isEmpty())
    {
      throw new Exception("隊(duì)列中無元素");
    }
    
    return this.doTake();
  }

}

3、通過輪詢與休眠來實(shí)現(xiàn)簡單的阻塞



package cn.xf.cp.ch14;

/**
 * 
 *功能:通過輪詢與休眠來實(shí)現(xiàn)簡單的阻塞
 *時(shí)間:下午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);
  }
  
  //放入隊(duì)列的時(shí)候
  public void put(V v) throws InterruptedException
  {
    while(true)
    {
      //這里不對(duì)循環(huán)上鎖,不然這個(gè)鎖就無法釋放了,不對(duì)休眠上鎖,休眠上鎖,在休眠的時(shí)候別人也無法操作,永遠(yuǎn)都不可能有元素出去
      synchronized (this)
      {
        //如果隊(duì)列不是滿的,那么就放入元素
        if(!this.isFull())
        {
          this.doPut(v);
          return;
        }
      }
      //否則休眠,退出cpu占用
      Thread.sleep(SLEEP_GRANULARITY);
    }
  }
  
  public V take() throws InterruptedException
  {
    while(true)
    {
      //這里不對(duì)循環(huán)上鎖,不然這個(gè)鎖就無法釋放了,不對(duì)休眠上鎖,休眠上鎖,在休眠的時(shí)候別人也無法操作,永遠(yuǎn)都不可能有新的元素進(jìn)來
      synchronized(this)
      {
        //如果數(shù)組部位空,那么就可以取出數(shù)據(jù)
        if(!this.isEmpty())
        {
          return this.doTake();
        }
        //如果隊(duì)列為空,休眠幾秒再試
      }
      Thread.sleep(SLEEP_GRANULARITY);
    }
  }
  
}

4、條件隊(duì)列



package cn.xf.cp.ch14;

/**
 * 
 *功能:使用條件隊(duì)列
 *時(shí)間:下午3:32:04
 *文件:BoundedBuffer.java 
 *@author Administrator
 *
 * @param <V>
 */
public class BoundedBuffer<V> extends BaseBoundedBuffer<V>
{

  public BoundedBuffer(int capacity)
  {
    super(capacity);
  }
  
  /**
   * 放入數(shù)據(jù)元素
   * @param v
   * @throws InterruptedException
   */
  public synchronized void put(V v) throws InterruptedException
  {
    while(this.isFull())
    {
      //這里掛起程序,會(huì)釋放鎖
      this.wait();
    }
    //如果隊(duì)列不為滿的,那么程序被喚醒之后從新獲取鎖
    this.doPut(v);
    //執(zhí)行結(jié)束,喚醒其他隊(duì)列
    this.notifyAll();
  }
  
  public synchronized V take() throws InterruptedException
  {
    while(this.isEmpty())
    {
      this.wait();
    }
    V v = this.doTake();
    this.notifyAll();
    return v;
  }
  
}

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • 使用ServletInputStream在攔截器或過濾器中應(yīng)用后重寫

    使用ServletInputStream在攔截器或過濾器中應(yīng)用后重寫

    這篇文章主要介紹了使用ServletInputStream在攔截器或過濾器中應(yīng)用后重寫,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java實(shí)現(xiàn)批量下載選中文件功能

    Java實(shí)現(xiàn)批量下載選中文件功能

    這篇文章主要介紹了Java實(shí)現(xiàn)批量下載選中文件功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-11-11
  • 全面解析Java main方法

    全面解析Java main方法

    main方法是我們學(xué)習(xí)Java語言學(xué)習(xí)的第一個(gè)方法,也是每個(gè)java使用者最熟悉的方法,每個(gè)Java應(yīng)用程序都必須有且僅有一個(gè)main方法。這篇文章通過實(shí)例代碼給大家介紹java main方法的相關(guān)知識(shí),感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧
    2018-05-05
  • java實(shí)現(xiàn)兩臺(tái)服務(wù)器間文件復(fù)制的方法

    java實(shí)現(xiàn)兩臺(tái)服務(wù)器間文件復(fù)制的方法

    這篇文章主要介紹了java實(shí)現(xiàn)兩臺(tái)服務(wù)器間文件復(fù)制的方法,是對(duì)單臺(tái)服務(wù)器上文件復(fù)制功能的升級(jí)與改進(jìn),具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-01-01
  • JAVA中重寫(Override)與重載(Overload)的相關(guān)示例

    JAVA中重寫(Override)與重載(Overload)的相關(guān)示例

    這篇文章主要給大家介紹了關(guān)于JAVA中重寫(Override)與重載(Overload)的相關(guān)示例,重寫(override)和重載(overload)是兩種不同的方法重用技術(shù),文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-10-10
  • Java字符串排序的幾種實(shí)現(xiàn)方式

    Java字符串排序的幾種實(shí)現(xiàn)方式

    這篇文章主要給大家介紹了關(guān)于Java字符串排序的幾種實(shí)現(xiàn)方式, 使用Java平臺(tái)進(jìn)行字符串排序被認(rèn)為是一件簡單的工作,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • SpringMVC基于配置的異常處理器

    SpringMVC基于配置的異常處理器

    這篇文章主要為大家介紹了SpringMVC基于配置的異常處理器,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • 深入Java冒泡排序與選擇排序的區(qū)別詳解

    深入Java冒泡排序與選擇排序的區(qū)別詳解

    本篇文章是對(duì)Java冒泡排序與選擇排序的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • SpringCloud Nacos集群搭建過程詳解

    SpringCloud Nacos集群搭建過程詳解

    Nacos集群不僅僅是服務(wù)注冊(cè)中心,還在微服務(wù)架構(gòu)中發(fā)揮著關(guān)鍵的角色,支持多種場景下的服務(wù)治理和協(xié)調(diào),本文介紹了如何在SpringCloud環(huán)境中搭建Nacos集群,為讀者提供了一份清晰而詳盡的指南,通過逐步演示每個(gè)關(guān)鍵步驟,讀者能夠輕松理解并操作整個(gè)搭建過程
    2024-02-02
  • Java 設(shè)計(jì)模式以虹貓藍(lán)兔的故事講解建造者模式

    Java 設(shè)計(jì)模式以虹貓藍(lán)兔的故事講解建造者模式

    建造者模式,是一種對(duì)象構(gòu)建模式 它可以將復(fù)雜對(duì)象的建造過程抽象出來,使這個(gè)抽象過程的不同實(shí)現(xiàn)方法可以構(gòu)造出不同表現(xiàn)的對(duì)象。本文將通過示例講解建造者模式,需要的可以參考一下
    2022-04-04

最新評(píng)論