Guarded Suspension【生产消费者模式】

一:guarded suspension的参与者
--->guardedObject(被防卫)参与者
                1.1该参与者拥有一个被防卫的方法(getRequest),如果警戒条件达成,则执行。警戒条件不达成,则线程进入wait set
                1.2该参与者还拥有一个改变参与者状态的方法(putRequest)。参与者的状态影响着警戒条件的是否达成。

--->该模式的角色:生产端线程,消费端线程,传递数据的摇篮(被防卫的参与者)
       

二:guarded suspension模式什么时候使用
--->适合交易系统使用。客户端下单,服务端处理订单。高并发,大量数据处理的模式,增强服务的吞吐量
   

三:guarded suspension思考
--->与该模式共通的三个特征
                3.1:有循环存在
                3.2:有条件测试
                3.3:有因某种原因的等待

---> guarded wait 被阻断而等待
        等待端范例:
        while(条件){
                wait();
        }
        唤醒端范例:
                条件=true
                notifyAll();
---> busy wait 忙碌地等待
        yield,尽可能把优先级交给其他线程,那个线程调用此方法,那个线程暂时一次让出CPU调度权。至于能否暂停,实际看cpu是否去掉别的线程。我主动放弃一次,至于cpu走不走,看cpu的。yield不会解除锁定,所以这段代码不可写在snychronized里。而ready字段必须声明成volatile
        等待端范例:
        while(ready){
                Thead.yield();
        }
        唤醒端范例:
        ready=true

---> spin lock 旋转而锁定
        旋转而锁定的意思,表现出条件成立前while循环不断"旋转"的样子,spin lock有时意思与guarded wait相同,有时则与busy wait相同。另外,有时候则是指一开始使用busy wait ,之后再切换成guarded wait方式。另外有些硬件实现的同步机制

--->polling
" 进行舆论调查"的意思,反复检查某个事件是否发生,当发生时就进行对应的处理。

 

模仿队列(传递数据)

 1 package com.yeepay.sxf.thread3;
 2 
 3 import java.util.LinkedList;
 4 
 5 /**
 6  * 存放实体的队列
 7  * @author sxf
 8  *
 9  */
10 public class RequestEntryQueue {
11     //存放请求的链表集合
12     private final LinkedList<RequestEntry> list=new LinkedList<RequestEntry>();
13     
14     
15     //从队列中取出请求
16     public synchronized  RequestEntry getRequestEntry(){
17         //判断存放请求的集合是否存在,请求,不存在,就让当前消费着线程进入wait set
18         while (list.size()<=0) {
19             try {
20                  wait();
21             } catch (InterruptedException e) {
22                 // TODO Auto-generated catch block
23                 e.printStackTrace();
24             }
25         
26         }
27         //如果不为空,则返回第一个请求,并从集合中删除该请求
28         return  list.removeFirst();
29     }
30     
31     
32     //往队列中放入请求
33     public synchronized void putRequestEntry(RequestEntry requestEntry){
34         //将新的请求放入队列
35         list.addLast(requestEntry);
36         //唤醒所有wait set中的线程
37         notifyAll();
38     }
39 }
View Code

相关文章:

  • 2021-07-10
  • 2021-12-02
  • 2022-12-23
  • 2021-09-27
  • 2022-01-02
  • 2021-10-17
  • 2021-10-18
  • 2021-11-14
猜你喜欢
  • 2021-10-28
  • 2021-09-19
  • 2021-09-17
  • 2021-12-22
  • 2022-12-23
  • 2021-09-24
相关资源
相似解决方案