亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

構建Java并發模型框架

2019-11-18 12:19:05
字體:
來源:轉載
供稿:網友

  java的多線程特性為構建高性能的應用提供了極大的方便,但是也帶來了不少的麻煩。線程間同步、數據一致性等煩瑣的問題需要細心的考慮,一不小心就會出現一些微妙的,難以調試的錯誤。另外,應用邏輯和線程邏輯糾纏在一起,會導致程序的邏輯結構混亂,難以復用和維護。本文試圖給出一個解決這個問題的方案,通過構建一個并發模型框架(framework),使得開發多線程的應用變得輕易。
  基礎知識
  Java語言提供了對于線程很好的支持,實現方法小巧、優雅。對于方法重入的保護,信號量(semaphore)和臨界區(critical section)機制的實現都非常簡潔。可以很輕易的實現多線程間的同步操作從而保護要害數據的一致性。這些特點使得Java成為面向對象語言中對于多線程特性支持方面的佼佼者(C++正在試圖把boost庫中的對于線程的支持部分納入語言標準)。
  Java中內置了對于對象并發訪問的支持,每一個對象都有一個監視器(monitor),同時只答應一個線程持有監視器從而進行對對象的訪問,那些沒有獲得監視器的線程必須等待直到持有監視器的線程釋放監視器。對象通過synchronized要害字來聲明線程必須獲得監視器才能進行對自己的訪問。
  synchronized聲明僅僅對于一些較為簡單的線程間同步問題比較有效,對于哪些復雜的同步問題,比如帶有條件的同步問題,Java提供了另外的解決方法,wait/notify/notifyAll。獲得對象監視器的線程可以通過調用該對象的wait方法主動釋放監視器,等待在該對象的線程等待隊列上,此時其他線程可以得到監視器從而訪問該對象,之后可以通過調用notify/notifyAll方法來喚醒先前因調用wait方法而等待的線程。一般情況下,對于wait/notify/notifyAll方法的調用都是根據一定的條件來進行的,比如:經典的生產者/消費者問題中對于隊列空、滿的判定。熟悉POSIX的讀者會發現,使用wait/notify/notifyAll可以很輕易的實現POSIX中的一個線程間的高級同步技術:條件變量。
  有很多的書籍、資料對于synchronized、wait/notify/notifyAll進行了具體的介紹,參考文獻〔3〕中對于synchronized要害字以及和線程有關的Java內存模型有深入具體的論述,有愛好的讀者可以自行學習,不在此贅述。
  簡單例子
  本文將圍繞一個簡單的例子展開論述,這樣可以更輕易突出我們解決問題的思路、方法。本文想向讀者展現的正是這些思路、方法。這些思路、方法更加適用于解決大規模、復雜應用中的并發問題。
  考慮一個簡單的例子,我們有一個服務提供者,它通過一個接口對外提供服務,服務內容非常簡單,就是在標準輸出上打印Hello World。類結構圖如下:
   構建Java并發模型框架
  代碼如下: 
  interface Service
  {
  public void sayHello();
  }
  
  class ServiceImp implements Service
  {
  public void sayHello() {
    System.out.  }
  }
  
  class Client
  {
  public Client(Service s) {
    _service = s;
  }  
  
  public void requestService() {
    _service.sayHello();
  }
  
  private Service _service;
  }
  假如現在有新的需求,要求該服務必須支持Client的并發訪問。一種簡單的方法就是在ServicImp類中的每個方法前面加上synchronized聲明,來保證自己內部數據的一致性(當然對于本例來說,目前是沒有必要的,因為ServiceImp沒有需要保護的數據,但是隨著需求的變化,以后可能會有的)。但是這樣做至少會存在以下幾個問題:
  現在要維護ServiceImp的兩個版本:多線程版本和單線程版本(有些地方,比如其他項目,可能沒有并發的問題),輕易帶來同步更新和正確選擇版本的問題,給維護帶來麻煩。
  假如多個并發的Client頻繁調用該服務,由于是直接同步調用,會造成Client阻塞,降低服務質量。
  很難進行一些靈活的控制,比如:根據Client的優先級進行排隊等等。
  這些問題對于大型的多線程應用服務器尤為突出,對于一些簡單的應用(如本文中的例子)可能根本不用考慮。本文正是要討論這些問題的解決方案,文中的簡單的例子只是提供了一個說明問題,展示思路、方法的平臺。
  如何才能較好的解決這些問題,有沒有一個可以重用的解決方案呢?讓我們先把這些問題放一放,先來談談和框架有關的一些問題。
  框架概述
  熟悉 面向對象的讀者一定知道面向對象的最大的優勢之一就是:軟件復用。通過復用,可以減少很多的工作量,提高軟件開發生產率。復用本身也是分層次的,代碼級的復用和設計架構的復用。
  大家可能非常熟悉C語言中的一些標準庫,它們提供了一些通用的功能讓你的程序使用。但是這些標準庫并不能影響你的程序結構和設計思路,僅僅是提供一些機能,幫助你的程序完成工作。它們使你不必重頭編寫一般性的通用功能(比如printf),它們強調的是程序代碼本身的復用性,而不是設計架構的復用性。
  那么什么是框架呢?所謂框架,它不同于一般的標準庫,是指一組緊密關聯的(類)classes,強調彼此的配合以完成某種可以重復運用的設計概念。這些類之間以特定的方式合作,彼此不可或缺。它們相當程度的影響了你的程序的形貌。框架本身規劃了應用程序的骨干,讓程序遵循一定的流程和動線,展現一定的風貌和功能。這樣就使程序員不必費力于通用性的功能的繁文縟節,集中精力于專業領域。
  有一點必須要強調,放之四海而皆準的框架是不存在的,也是最沒有用處的。框架往往都是針對某個特定應用領域的,是在對這個應用領域進行深刻理解的基礎上,抽象出該應用的概念模型,在這些抽象的概念上搭建的一個模型,是一個有形無體的框架。不同的具體應用根據自身的特點對框架中的抽象概念進行實現,從而賦予框架生命,完成應用的功能。
  基于框架的應用都有兩部分構成:框架部分和特定應用部分。要想達到框架復用的目標,必須要做到框架部分和特定應用部分的隔離。使用面向對象的一個強大功能:多態,可以實現這一點。在框架中完成抽象概念之間的交互、關聯,把具體的實現交給特定的應用來完成。其中一般都會大量使用了Template Method設計模式。
  Java中的Collection Framework以及微軟的MFC都是框架方面很好的例子。有愛好的讀者可以自行研究。
  構建框架
  如何構建一個Java并發模型框架呢?讓我們先回到原來的問題,先來分析一下原因。造成要維護多線程和單線程兩個版本的原因是由于把應用邏輯和并發邏輯混在一起,假如能夠做到把應用邏輯和并發模型進行很好的隔離,那么應用邏輯本身就可以很好的被復用,而且也很輕易把并發邏輯添加進來而不會對應用邏輯造成任何影響。造成Client阻塞,性能降低以及無法進行額外的控制的原因是由于所有的服務調用都是同步的,解決方案很簡單,改為異步調用方式,把服務的調用和服務的執行分離。
  
  首先來介紹一個概念,活動對象(Active Object)。所謂活動對象是相對于被動對象(passive object)而言的,被動對象的方法的調用和執行都是在同一個線程中的,被動對象方法的調用是同步的、阻塞的,一般的對象都屬于被動對象;主動對象的方法的調用和執行是分離的,主動對象有自己獨立的執行線程,主動對象的方法的調用是由其他線程發起的,但是方法是在自己的線程中執行的,主動對象方法的調用是異步的,非阻塞的。
  本框架的核心就是使用主動對象來封裝并發邏輯,然后把Client的請求轉發給實際的服務提供者(應用邏輯),這樣無論是Client還是實際的服務提供者都不用關心并發的存在,不用考慮并發所帶來的數據一致性問題。從而實現應用邏輯和并發邏輯的隔離,服務調用和服務執行的隔離。下面給出要害的實現細節。
  本框架有如下幾部分構成:
  一個ActiveObject類,從Thread繼續,封裝了并發邏輯的活動對象
  一個ActiveQueue類,主要用來存放調用者請求
  一個MethodRequest接口,主要用來封裝調用者的請求,Command設計模式的一種實現方式
  它們的一個簡單的實現如下:
  //MethodRequest接口定義
   interface MethodRequest
  {
  public void call();
  }
  
  //ActiveQueue定義,其實就是一個prodUCer/consumer隊列
  class ActiveQueue
  {
   public ActiveQueue() {
    _queue = new Stack();
   }
  
  public synchronized void enqueue(MethodRequest mr) {
    while(_queue.size() > QUEUE_SIZE) {
      try {
          wait();
      }catch (InterruptedException e) {
          e.printStackTrace();
      } 
    }
    
    _queue.push(mr);
    notifyAll();
    System.out.println("Leave Queue");
  }
  
  public synchronized MethodRequest dequeue() {
    MethodRequest mr;
    
    while(_queue.empty()) {
      try {
        wait();
      }catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
    mr = (MethodRequest)_queue.pop();
    notifyAll();
    
   return mr;
  }  
  
  private Stack _queue;
  pri

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品一区精品二区| 国产91免费观看| 黑人极品videos精品欧美裸| 欧美性高潮在线| 成人黄色大片在线免费观看| 欧洲亚洲在线视频| 国产欧美 在线欧美| 91精品在线国产| 日韩国产高清视频在线| 精品成人av一区| 亚洲影院色在线观看免费| 欧美极品少妇全裸体| 色偷偷噜噜噜亚洲男人的天堂| 亚洲美女福利视频网站| 日韩中文字幕不卡视频| 亚洲人成啪啪网站| 欧美激情一区二区三区高清视频| 国产精品一区二区久久精品| 亚洲福利精品在线| 久久久久国产精品www| 国产精品va在线播放| 国产视频精品va久久久久久| 欧美乱大交xxxxx另类电影| 欧美国产高跟鞋裸体秀xxxhd| 日韩精品免费电影| 国产成人久久久| 成人av番号网| 欧美精品videosex极品1| 国产成人精品视频在线| 18一19gay欧美视频网站| 久久99久久久久久久噜噜| 日韩在线播放av| 一区二区在线视频播放| 久久国产色av| 4438全国成人免费| 国产免费久久av| 国产情人节一区| 中文欧美在线视频| 欧洲美女免费图片一区| 中文字幕成人在线| 97热在线精品视频在线观看| 久久久国产精彩视频美女艺术照福利| 成人免费高清完整版在线观看| 色偷偷av一区二区三区乱| 国产一区二区黑人欧美xxxx| 日韩高清免费观看| 亚洲第一av在线| 清纯唯美亚洲激情| 精品视频久久久久久久| 亚洲国模精品私拍| 国产丝袜一区二区三区免费视频| 国产精品视频导航| 亚洲女人初尝黑人巨大| 国产日韩中文字幕在线| 日韩欧美国产高清91| 久久久久久这里只有精品| 97在线视频国产| 国产精品成久久久久三级| 国产成人精品免费视频| 色系列之999| 国内精品中文字幕| 国产精品自拍网| 一区二区亚洲欧洲国产日韩| 亚洲免费一级电影| 久久在线免费观看视频| 国产欧美精品xxxx另类| 午夜精品久久久久久久久久久久| 中文字幕久热精品视频在线| 欧美日本黄视频| 一夜七次郎国产精品亚洲| 成人两性免费视频| 色综合老司机第九色激情| 成人国产精品免费视频| 日韩久久免费电影| 亚洲欧美国产日韩中文字幕| 日韩欧美亚洲成人| 91视频国产精品| 成人a级免费视频| 精品国产一区av| 欧美精品在线网站| 欧美在线视频一区| 亚洲wwwav| 日韩美女免费视频| 成人免费视频网址| 亚洲一区中文字幕在线观看| 久久亚洲精品网站| 国产亚洲福利一区| 97成人精品区在线播放| 亚洲精品电影网在线观看| 日韩精品在线播放| 性色av一区二区三区免费| 欧美激情中文字幕乱码免费| 亚洲第一区在线观看| 国产va免费精品高清在线| 黑人巨大精品欧美一区免费视频| 欧美另类在线观看| 欧美国产高跟鞋裸体秀xxxhd| 久久精品视频在线| 成人黄色午夜影院| 久久久女人电视剧免费播放下载| 亚洲国产成人91精品| 国产精品久久9| 亚洲天堂av电影| 欧美日韩电影在线观看| 亚洲一区二区三区sesese| 欧美贵妇videos办公室| 色悠久久久久综合先锋影音下载| 成人性教育视频在线观看| 久久av在线播放| 26uuu另类亚洲欧美日本老年| 亚洲欧洲在线观看| 国产成人精品日本亚洲| 按摩亚洲人久久| 成人黄色av网| xvideos成人免费中文版| 欧美激情xxxx| 91干在线观看| 亚洲福利在线观看| 欧美日韩亚洲系列| 亚洲第一色中文字幕| 亲爱的老师9免费观看全集电视剧| 色妞久久福利网| 国产美女久久久| 超碰精品一区二区三区乱码| 成人h视频在线观看播放| 中文字幕久热精品在线视频| 日韩国产高清污视频在线观看| 色黄久久久久久| 欧美日韩在线影院| 7777精品久久久久久| 亚洲精品欧美日韩| 国产精品91久久久久久| 亚洲人午夜精品| 国产成人精品在线| 亚洲成年网站在线观看| 亚洲视频免费一区| 国产欧美精品日韩| 高清欧美性猛交xxxx| 日韩精品高清在线| 最新91在线视频| 精品高清美女精品国产区| 裸体女人亚洲精品一区| 欧美精品国产精品日韩精品| 91精品国产乱码久久久久久久久| 久久天天躁狠狠躁夜夜躁2014| 久久久久久美女| 亚洲精品网址在线观看| 亚洲激情第一页| 日韩精品视频在线观看免费| 久久影院在线观看| 国产97在线观看| 91夜夜未满十八勿入爽爽影院| 91久久久久久久久久久久久| 日韩欧美国产高清91| 日韩精品在线观看一区二区| 国产在线观看精品一区二区三区| 国产午夜一区二区| 欧美激情第一页xxx| 欧美成人免费全部观看天天性色| 久久精品视频免费播放| 日韩在线观看高清| 久久久免费高清电视剧观看| 国产日韩欧美另类| 日本一区二区三区在线播放|