一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術(shù)|正則表達(dá)式|

服務(wù)器之家 - 編程語言 - JAVA教程 - JAVA并發(fā)編程有界緩存的實(shí)現(xiàn)詳解

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

2020-07-09 11:13java教程網(wǎng) JAVA教程

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

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

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;
 
/**
 *
 *功能:有界緩存實(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í)行操作

?
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;
 
/**
 *
 *功能:對(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)簡單的阻塞

?
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;
 
/**
 *
 *功能:通過輪詢與休眠來實(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ì)列

?
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;
 
/**
 *
 *功能:使用條件隊(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ì)本站的支持!

延伸 · 閱讀

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

    java 集合----Map、Collection

    HashSet 的 add() 方法添加集合元素時(shí)實(shí)際上轉(zhuǎn)變?yōu)檎{(diào)用 HashMap 的 put()方法來添加 key-value 對(duì)。HashMap 的 put() 方法.hashCode() 判斷返回值相等,如果返回值相等則...

    liuyaqian2692020-04-21
  • JAVA教程java生成隨機(jī)數(shù)的方法

    java生成隨機(jī)數(shù)的方法

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

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

    java模式匹配之蠻力匹配

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

    hebedich4312019-12-19
  • JAVA教程JavaI/O深入學(xué)習(xí)之輸入和輸出

    JavaI/O深入學(xué)習(xí)之輸入和輸出

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

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

    Java創(chuàng)建線程的兩種方式

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

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

    Datagram Scoket雙向通信

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

    Java教程網(wǎng)2392019-11-20
  • JAVA教程java正則表達(dá)式簡單應(yīng)用

    java正則表達(dá)式簡單應(yīng)用

    這篇文章主要介紹了java正則表達(dá)式簡單應(yīng)用,在之前幾篇文章中已經(jīng)深入學(xué)習(xí)了java正則表達(dá)式基礎(chǔ)知識(shí),本文對(duì)java正則表達(dá)式應(yīng)用進(jìn)行研究,感興趣的小...

    牛奶、不加糖2002020-03-11
  • JAVA教程Java網(wǎng)絡(luò)編程基礎(chǔ)教程之Socket入門實(shí)例

    Java網(wǎng)絡(luò)編程基礎(chǔ)教程之Socket入門實(shí)例

    這篇文章主要介紹了Java網(wǎng)絡(luò)編程基礎(chǔ)教程之Socket入門實(shí)例,本文講解了創(chuàng)建Socket、Socket發(fā)送數(shù)據(jù)、Socket讀取數(shù)據(jù)、關(guān)閉Socket等內(nèi)容,都是最基礎(chǔ)的知識(shí)點(diǎn),需要...

    junjie4462019-11-28
主站蜘蛛池模板: 久久夜色噜噜噜亚洲AV0000 | 美女视频91 | 天堂伊人 | 亚洲国产成人资源在线桃色 | 精品一区二区三区免费毛片 | 青草青青在线视频 | 国产精品嫩草影院在线 | 国产精品成人亚洲 | 国产成人久久精品推最新 | 14一15sexvideo日本| 高清麻生希在线 | 大好硬好深好爽想要视频 | 乌克兰肛交影视 | 高清毛片aaaaaaaaa片 | 性欧美f | a片毛片在线免费看 | 99视频在线观看免费视频 | 希岛爱理作品在线观看 | 国产一区在线免费观看 | 秋霞午夜视频在线观看 | 乖女的嫩奶水h文孕妇 | 7777奇米 | 亚洲欧美一区二区三区不卡 | 成人区精品一区二区毛片不卡 | 欧美亚洲免费 | 娇喘高潮教室h | 水蜜臀 | 女教师被学生糟蹋三天 | 成年人视频在线免费观看 | 免费91麻豆精品国产自产在线观看 | 色婷婷网 | 东方影视欧美天天影院 | 久久国产伦子伦精品 | 国产欧美曰韩一区二区三区 | 无遮无挡免费视频 | 艹出白浆 | 白丝萝莉喷水 | 大学生初次破苞免费视频 | 校园春色自拍偷拍 | 日本小视频网站 | 日韩成人在线影院 |