最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

1、有界緩存的基類



package cn.xf.cp.ch14;

/**
 * 
 *功能:有界緩存實現(xiàn)基類
 *時間:下午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];
  }
  
  //放入一個數(shù)據(jù),final方法無法被重寫
  protected synchronized final void doPut(V v)
  {
    buf[tail] = v;
    if(++tail == buf.length)
    {
      tail = 0;
    }
    //插入一個方法,總量++
    ++count;
  }
  
  /**
   * 取出一個數(shù)據(jù)
   * @return
   */
  protected synchronized final V doTake()
  {
    V v = buf[head];
    buf[head] = null;
    if(++head == buf.length)
    {
      head = 0;
    }
    --count;
    return v;
  }
  
  //通過對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;

/**
 * 
 *功能:對插入和獲取元素操作進行先行檢查,然后執(zhí)行操作,校驗不通過不予操作
 *時間:下午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、通過輪詢與休眠來實現(xiàn)簡單的阻塞



package cn.xf.cp.ch14;

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

4、條件隊列



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

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

相關(guān)文章

  • Java打印流原理及實例詳解

    Java打印流原理及實例詳解

    這篇文章主要介紹了Java打印流原理及實例詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • 重寫hashCode()和equals()方法詳細介紹

    重寫hashCode()和equals()方法詳細介紹

    這篇文章主要介紹了重寫hashCode()和equals()方法詳細介紹,涉及重寫equals()方法,重寫hashCode()方法,重寫equals()而不重寫hashCode()的風險等相關(guān)內(nèi)容的介紹,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • 全面解析SpringBoot自動配置的實現(xiàn)原理

    全面解析SpringBoot自動配置的實現(xiàn)原理

    這篇文章主要介紹了全面解析SpringBoot自動配置的實現(xiàn)原理的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • Java Spring IOC圖文詳解

    Java Spring IOC圖文詳解

    IoC是一種讓服務消費者不直接依賴于服務提供者的組件設計方式,是一種減少類與類之間依賴的設計原則。下面通過本文給大家分享spring中ioc的概念,感興趣的朋友一起看看吧
    2021-09-09
  • springBoot的事件機制GenericApplicationListener用法解析

    springBoot的事件機制GenericApplicationListener用法解析

    這篇文章主要介紹了springBoot的事件機制GenericApplicationListener用法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值的相關(guān)資料
    2019-09-09
  • Compare And Swap底層原理及代碼示例詳解

    Compare And Swap底層原理及代碼示例詳解

    這篇文章主要介紹了Compare And Swap底層原理及代碼示例詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • Spring注解與P/C命名空間超詳細解析

    Spring注解與P/C命名空間超詳細解析

    Spring注解方式減少了配置文件內(nèi)容,更加便于管理,并且使用注解可以大大提高了開發(fā)效率!注解本身是沒有功能的,和xml一樣,注解和xml都是一種元數(shù)據(jù),元數(shù)據(jù)即解釋數(shù)據(jù)的數(shù)據(jù),也就是所謂的配置
    2022-11-11
  • SpringBoot配置默認HikariCP數(shù)據(jù)源

    SpringBoot配置默認HikariCP數(shù)據(jù)源

    咱們開發(fā)項目的過程中用到很多的開源數(shù)據(jù)庫鏈接池,比如druid、c3p0、BoneCP等等,本文主要介紹了SpringBoot配置默認HikariCP數(shù)據(jù)源,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • Spring Boot 使用 Swagger 構(gòu)建 RestAPI 接口文檔

    Spring Boot 使用 Swagger 構(gòu)建 RestAPI 接口文檔

    這篇文章主要介紹了Spring Boot 使用 Swagger 構(gòu)建 RestAPI 接口文檔,幫助大家更好的理解和使用Spring Boot框架,感興趣的朋友可以了解下
    2020-10-10
  • springMVC盜鏈接詳解

    springMVC盜鏈接詳解

    這篇文章主要為大家詳細介紹了SpringMVC盜鏈接詳解,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能給你帶來幫助
    2021-07-07

最新評論

文水县| 永城市| 资兴市| 新疆| 封开县| 包头市| 周口市| 蓝山县| 锡林郭勒盟| 罗平县| 日喀则市| 屏东县| 兴业县| 吴桥县| 桂平市| 诏安县| 龙胜| 肇州县| 南丰县| 沛县| 玉屏| 无棣县| 重庆市| 大兴区| 厦门市| 平湖市| 长海县| 永嘉县| 武义县| 来宾市| 芜湖县| 北票市| 四子王旗| 东城区| 象山县| 犍为县| 奉化市| 县级市| 苏尼特左旗| 泗水县| 清河县|