激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|正則表達式|

香港云服务器
服務器之家 - 編程語言 - JAVA教程 - JAVA并發編程有界緩存的實現詳解

JAVA并發編程有界緩存的實現詳解

2020-07-09 11:13java教程網 JAVA教程

這篇文章主要介紹了JAVA并發編程有界緩存的實現詳解的相關資料,這里舉例說明如何實現,四種方法一一代碼實現,需要的朋友可以參考下

JAVA并發編程有界緩存的實現

1、有界緩存的基類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
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、判定前提條件再執行操作

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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、通過輪詢與休眠來實現簡單的阻塞

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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、條件隊列

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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;
  }
  
}

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

延伸 · 閱讀

精彩推薦
  • JAVA教程java 集合----Map、Collection

    java 集合----Map、Collection

    HashSet 的 add() 方法添加集合元素時實際上轉變為調用 HashMap 的 put()方法來添加 key-value 對。HashMap 的 put() 方法.hashCode() 判斷返回值相等,如果返回值相等則...

    liuyaqian2692020-04-21
  • JAVA教程java生成隨機數的方法

    java生成隨機數的方法

    這篇文章主要介紹了java生成隨機數的方法,涉及java隨機數及字符串操作的相關技巧,需要的朋友可以參考下 ...

    wo_soul3102019-12-19
  • JAVA教程java模式匹配之蠻力匹配

    java模式匹配之蠻力匹配

    這篇文章主要介紹了java模式匹配之蠻力匹配的相關資料和代碼,需要的朋友可以參考下 ...

    hebedich4312019-12-19
  • JAVA教程JavaI/O深入學習之輸入和輸出

    JavaI/O深入學習之輸入和輸出

    這篇文章主要介紹了JavaI/O深入學習之輸入和輸出,Java類庫中的I/O類分成輸入和輸出兩部分,可以在JDK文檔里的類層次結構中查看到。,需要的朋友可以參考...

    木瓜芒果4592019-07-07
  • JAVA教程Java創建線程的兩種方式

    Java創建線程的兩種方式

    這篇文章主要介紹了Java創建線程的兩種方式,針對Java創建線程的兩種方式進行比較,感興趣的小伙伴們可以參考一下 ...

    Holten1912020-06-24
  • JAVA教程Datagram Scoket雙向通信

    Datagram Scoket雙向通信

    這篇文章主要介紹了Datagram Scoket雙向通信,需要的朋友可以參考下 ...

    Java教程網2392019-11-20
  • JAVA教程java正則表達式簡單應用

    java正則表達式簡單應用

    這篇文章主要介紹了java正則表達式簡單應用,在之前幾篇文章中已經深入學習了java正則表達式基礎知識,本文對java正則表達式應用進行研究,感興趣的小...

    牛奶、不加糖2002020-03-11
  • JAVA教程Java網絡編程基礎教程之Socket入門實例

    Java網絡編程基礎教程之Socket入門實例

    這篇文章主要介紹了Java網絡編程基礎教程之Socket入門實例,本文講解了創建Socket、Socket發送數據、Socket讀取數據、關閉Socket等內容,都是最基礎的知識點,需要...

    junjie4462019-11-28
590
主站蜘蛛池模板: 91社 | 午夜免费网 | 久久成人免费网 | 成人富二代短视频 | 久久精品久久久久 | 欧美一级美国一级 | 牛牛a级毛片在线播放 | 97伦理| 亚洲一级毛片 | 日本在线免费观看 | 国产精品99久久久久久久女警 | 中文在线观看www | 免费男女视频 | av在线播放亚洲 | 久久综合入口 | 在线成人免费观看 | 国产成人高清成人av片在线看 | 国产在线观看福利 | 国产无遮挡一级毛片 | 国产在线观看福利 | 黄色影院在线 | 最新av在线免费观看 | 一级电影免费看 | 欧美精品成人一区二区在线观看 | 色综合激情 | 久久精品久久精品国产大片 | 国产精品99久久久久久大便 | 精品中文字幕在线观看 | 免费黄色一级网站 | 高清在线观看av | 中午字幕无线码一区2020 | 欧美性激情视频 | 免费a级网站 | 日本成人午夜视频 | 美女污污视频在线观看 | 欧美日韩一 | 久久在草| www.狠狠操.com| 亚洲极色| 一级大片一级一大片 | 香蕉久久久久 |