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ì)本站的支持!