java調度演算法
⑴ 主流虛擬化技術有哪些 詳解五大虛擬化主流技術
要了解詳情,請加我的號,或照片上有我的照片,我們私聊。可以免費試用的哦!!!!!!!!!自從虛擬化提出以後,至今虛擬化技術分類有很多,方法也有很多,下面來一起了解下什麼是虛擬化技術,及分類和方法。當今發達國家在設計、製造、加工技術等方面已經達到相當自動化的水平,其產品設計普遍採用CAD、CAM、CAE和計算機模擬等手段,企業管理也已採用了科學的規范化的管理方法和手段,目前其主要從製造系統自動化方面尋找出路,為此提出了一系列新的製造系統,如敏捷製造、並行工程、計算機集成製造系統等。近些年,從虛擬機的大量部署到成功案例逐漸涌現,越來越多的製造企業開始關注虛擬化技術給優化IT基礎架構,推動業務創新帶來的啟發,希望將其與業務相結合,找到掌握新技術、革新先進製造系統和先進製造模式的方法。虛擬化目前應用於製造業信息化主要體現在IT整合和節約成本,在其他方面很少,而實際上由於虛擬化技術的特點,其應用價值可以在遠程公、虛擬製造、工業控制等製造業相關領域都能得到體現。本文主要對虛擬化技術及其在製造業的應用現狀進行綜述,提出虛擬化在製造業的應用框架,為相關人員提供該領域的應用研究進展與發展趨勢方面的介紹。1虛擬化技術虛擬化是指為運行的程序或軟體營造它所需要的執行環境,在採用虛擬化技術後,程序或軟體的運行不再獨享底層的物理計算資源,它只是運行在一個完全相同的物理計算資源中,而底層的影響可能與之前所運行的計算機結構完全不同。虛擬化的主要目的是對IT基礎設施和資源管理方式的簡化。虛擬化的消費者可以是最終用戶、應用程序、操作系統、訪問資源或與資源交互相關的其他服務。由於虛擬化能降低消費者與資源之間的耦合程度,消費者不再依賴於資源的特定實現,因此在對消費者的管理工作影響最小的基礎上,可以通過手工、半自動、或者服務級協定(SLA)等來實現對資源的管理。1.1虛擬化的分類從虛擬化的目的來看,虛擬化技術主要分為以下幾個大類:(1)平台虛擬化(PlatformVirtualization),它是針對計算機和操作系統的虛擬化,又分成伺服器虛擬化和桌面虛擬化。伺服器虛擬化是一種通過區分資源的優先次序,並將伺服器資源分配給最需要它們的工作負載的虛擬化模式,它通過減少為單個工作負載峰值而儲備的資源來簡化管理和提高效率。桌面虛擬化是為提高人對計算機的操控力,降低計算機使用的復雜性,為用戶提供更加方便適用的使用環境的一種虛擬化模式。平台虛擬化主要通過CPU虛擬化、內存虛擬化和I/O介面虛擬化來實現。(2)資源虛擬化(ResourceVirtualization),針對特定的計算資源進行的虛擬化,例如,存儲虛擬化、網路資源虛擬化等。存儲虛擬化是指把操作系統有機地分布於若干內外存儲器,兩者結合成為虛擬存儲器。網路資源虛擬化最典型的是網格計算,網格計算通過使用虛擬化技術來管理網路上的數據,並在邏輯上將其作為一個系統呈現給消費者,它動態地提供了符合用戶和應用程序需求的資源,同時還將提供對基礎設施的共享和訪問的簡化。當前,有些研究人員提出利用軟體代理技術來實現計算網路空間資源的虛擬化,如Gaia,NetChaser[21],SpatialAgent。(3)應用程序虛擬化(ApplicationVirtualization),它包括模擬、模擬、解釋技術等。java虛擬機是典型的在應用層進行虛擬化。基於應用層的虛擬化技術,通過保存用戶的個性化計算環境的配置信息,可以實現在任意計算機上重現用戶的個性化計算環境。服務虛擬化是近年研究的一個熱點,服務虛擬化可以使業務用戶能按需快速構建應用的需求,通過服務聚合,可屏蔽服務資源使用的復雜性,使用戶更易於直接將業務需求映射到虛擬化的服務資源。現代軟體體系結構及其配置的復雜性阻礙了軟體開發生命周期,通過在應用層建立虛擬化的模型,可以提供最佳開發測試和運行環境。(4)表示層虛擬化。在應用上與應用程序虛擬化類似,所不同的是表示層虛擬化中的應用程序運行在伺服器上,客戶機只顯示應用程序的UI界面和用戶操作。表示層虛擬化軟體主要有微軟的Windows遠程桌面(包括終端服務)、和SymantecPcAnywhere等。1.2虛擬化的方法通常所說的虛擬化主要是指平台虛擬化,它通過控製程序隱藏計算平台的實際物理特性,為用戶提供抽象的、統一的、模擬的計算環境。通常虛擬化可以通過指令級虛擬化和系統級虛擬化來實現。1.2.1指令級虛擬化方法在指令集層次上實現虛擬化,即將某個硬體平台上的二進制代碼轉換為另一個平台上的二進制代碼,實現不同指令集間的兼容,也被稱作「二進制翻譯」。二進制翻譯是通過模擬來實現的,即在一個具有某種介面和功能的系統上實現另一種與之具有不同介面和功能的系統。二進制翻譯的軟體方式,它可以有3種方式實現:解釋執行、靜態翻譯、動態翻譯。近年來,最新的二進制翻譯系統的研究主要在運行時編譯、自適應優化方面,由於動態翻譯和執行過程的時間開銷主要包括四部分:即磁碟訪問開銷、存儲訪問開銷、翻譯和優化開銷、目標代碼的執行開銷,所以要提高二進制翻譯系統的效率主要應減少後3個方面的開銷。目前典型的二進制翻譯系統主要有Daisy/BOA、Crusoe、Aeries、IA-32EL、Dynamo動態優化系統和JIT編譯技術等。1.2.2系統級虛擬化方法系統虛擬化是在一台物理機上虛擬出多個虛擬機。從系統架構看,虛擬機監控器(VMM)是整個虛擬機系統的核心,它承擔了資源的調度、分配和管理,保證多個虛擬機能夠相互隔離的同時運行多個客戶操作系統。系統級虛擬化要通過CPU虛擬化、內存虛擬化和I/O虛擬化實現。(1)CPU虛擬化CPU虛擬化為每個虛擬機提供一個或多個虛擬CPU,多個虛擬CPU分時復用物理CPU,任意時刻一個物理CPU只能被一個虛擬CPU使用。VMM必須為各虛擬CPU合理分配時間片並維護所有虛擬CPU的狀態,當一個虛擬CPU的時間片用完需要切換時,要保存當前虛擬CPU的狀態,將被調度的虛擬CPU的狀態載入物理CPU。X86的CPU虛擬化方法主要有:二進制代碼動態翻譯(dynamicbinarytranslation)、半虛擬化(para-virtualization)和預虛擬化技術。為了彌補處理器的虛擬化缺陷,現有的虛擬機系統都採用硬體輔助虛擬化技術。CPU虛擬化需要解決的問題是:①虛擬CPU的正確運行,虛擬CPU正確運行的關鍵是保證虛擬機指令正確執行,各虛擬機之間不互相影響,即指令的執行結果不改變其他虛擬機的狀態,目前主要是通過模擬執行和監控運行;②虛擬CPU的調度。虛擬CPU的調度是指由VMM決定當前哪一個虛擬CPU實際在物理CPU上運行,保證虛擬機之間的隔離性、虛擬CPU的性能、調度的公平。虛擬機環境的調度需求是要充分利用CPU資源、支持精確的CPU分配、性能隔離、考慮虛擬機之間的不對等、考慮虛擬機之間的依賴。常見的CPU調度演算法有BVT、SEDF、CB等。(2)內存虛擬化VMM通常採用分塊共享的思想來虛擬計算機的物理內存。VMM將機器的內存分配給各個虛擬機,並維護機器內存和虛擬機內存之間的映射關系,這些內存在虛擬機看來是一段從地址0開始的、連續的物理地址空間。在進行內存虛擬化後,內存地址將有機器地址、偽物理地址和虛擬地址三種地址。在X86的內存定址機制中,VMM能夠以頁面為單位建立虛擬地址到機器地址的映射關系,並利用頁面許可權設置實現不同虛擬機間內存的隔離和保護。為了提高地址轉換的性能,X86處理器中加入TLB,緩存已經轉換過的虛擬地址,在每次虛擬地址空間切換時,硬體自動完成切塊TLB。為了實現虛擬地址到物理地址的高效轉換,通常採取復合映射的思想,通過MMU半虛擬化和影子頁表來實現頁表的虛擬化。虛擬機監控器的數據不能被虛擬機訪問,因此需要一種隔離機制,這種隔離機制主要通過修改客戶操作系統或段保護來實現。內存虛擬化的優化機制,包括按需取頁、虛擬存儲、內存共享等。(3)I/O虛擬化由於I/O設備具有異構性強,內部狀態不易控制等特點,VMM系統針對I/O設備虛擬化有全虛擬化、半虛擬化、軟體模擬和直接I/O訪問等設計思路。近年來,的學者將I/O虛擬化的研究放在共享的網路設備虛擬化研究,提出將IOVM結構映射到多核心伺服器平台。I/O設備除了增加吞吐量和固有的並行數據流、聯系串列特性以及基於分組的協議外,還應該考慮到傳統的PCI兼容的PCIExpress的硬體,建立相應的匯流排適配器,以彌補象單一主機無專門的驅動程序時的需要。有些研究人員專注於外存儲虛擬化的研究,提出讓存儲虛擬化系統上的SCSI目標模擬器運行在SAN上,存儲動態的目標主機的物理信息,並使用映射表方法來修改SCSI命令地址,使用點陣圖的技術來管理可用空間等思想。存儲虛擬化系統應提供諸如邏輯卷大小、各種功能、數據鏡像和快照,並兼容集群主機和多個操作系統。由於外存儲虛擬化能全面提升存儲區域網路的服務質量,而帶外虛擬化與帶內虛擬化相比具有性能高和擴展性好等優點,通過運用按序操作、Redo日誌以及日誌完整性鑒別,設計基於關系模型的磁碟上虛擬化元數據組織方式,可以形成一致持久的帶外虛擬化系統。1.3虛擬化的管理虛擬化的管理主要指多虛擬機系統的管理,多虛擬機系統是指在對多計算系統資源抽象表示的基礎上,按照自己的資源配置構建虛擬計算系統,其主要包括虛擬機的動態遷移技術和虛擬機的管理技術。(1)虛擬機之間的遷移將虛擬化作為一種手段管理現有的資源和加強其在網路計算的利用率,通過構建分布式可重構的虛擬機,必要時在物理伺服器運行時遷移服務。通過移動代理技術、分布式虛擬機等提高資源利用率和服務可用性,通過尋找服務最優的策略在可重構和分布式虛擬機上遷移。為了將虛擬機運行的操作系統與應用程序從一個物理結點遷移到另外一個運行結點,同時保持客戶操作系統和應用程序不受干擾,有些研究者提出以數據為中心的可遷移的虛擬運行環境,使得用戶操作環境實現異地遷移、無縫重構;也有研究人員提出程序執行環境的動態按需配置機制。在跨物理伺服器遷移虛擬機,進行自動化的虛擬伺服器的管理,必須考慮高層次的服務質量要求和資源管理成本。有些研究人員提出了通過管理程序控制的方法,以支持移動IP的實時遷移虛擬機在網路上,使虛擬機實時遷移其分布計算資源,從而改善遷移性能,降低網路恢復延遲,提供高可靠性和容錯。有些研究機構通過設計一個通用的硬體抽象層,實現多個虛擬機的移植,具有高效率執行環境中的移動設備。虛擬機的遷移步驟一般有啟動遷移、內存遷移、凍結虛擬機、虛擬機恢復執行。(2)虛擬機的管理對於多虛擬機來說,一個非常重要的方面是減少用戶對動態的和復雜的物理設備的管理和維護,通過軟體和工具來實現任務管理。當前典型的多虛擬機伺服器管理軟體是VirtualInfrastructure,它通過VirtualCenter管理伺服器的虛擬機池,通過VMotion完成虛擬機的遷移,通過VMFS管理多虛擬機文件系統。其次,Parallax是針對Xen的多虛擬機管理器,它通過採用消除寫共享,增強客戶端的緩存等方式並利用模板映像來建立整個系統;同時使用快照(snapshot)以及寫時復制(-on-write)機制來實現塊級共享,並使用副本來保證可用性。虛擬機監控器直接控制parallax使用的物理盤,它們運行物理設備驅動器,並給虛擬磁碟鏡像VDI的本地虛擬機提供一個普通的塊介面。2虛擬化在製造業信息化中的應用2.1虛擬化在製造業信息化中的應用框架當今製造業正朝著精密化、自動化、柔性化、集成化、網路化、信息化和智能化的方向發展,在這種趨勢下,誕生了許多先進製造技術和先進製造模式。這些先進製造技術和先進製造模式要求現有的IT基礎設施能提供更高的計算服務水平,因此在製造業信息化中,需要建立以虛擬化為導向的資源分配體系結構,提供客戶驅動的服務管理和計算風險管理,維持以服務水平協議(SLA)為導向的資源分配體系。虛擬化在製造業信息化中主要用於集中IT管理、應用整合、工業控制、虛擬製造等。處在最底層的是製造業企業的虛擬計算資源池(VirtualCluster),它由多台物理伺服器(PhysicsMachine)形成,各物理伺服器上運行著虛擬化軟體(VMM),虛擬化軟體上運行著完成各種任務需求的虛擬機,虛擬計算資源池的虛擬化管理軟體(VMS)為IT環境提供集中化、操作自動化、資源優化的功能,可以快速部署向導和虛擬機模板。虛擬計算資源池中的虛擬機將不同類型的客戶操作系統(GuestOS)和運行其上的數據層、服務層應用程序(App)封裝在一起,形成一個企業協同設計製造的完整系統,為表示層的用戶提供多種形態的數據處理和顯示功能。在圖1的框架中,虛擬計算資源池的動態資源調度(DRS)模塊可以跨越物理機不間斷地監控資源利用率,並根據反映業務需要和不斷變化的優先順序的預定規則,在多個虛擬機之間分配可用資源。在製造業信息化中,集中IT管理、應用整合、工業控制、虛擬製造等多種應用需求都將以各種服務的形式被封裝到了虛擬機中,例如製造任務協同服務、資源管理服務、信息訪問服務、WWW服務、工業控制服務、應用系統集成服務、數據管理服務、高效能計算服務、工具集服務等;同時支撐所有應用需求的資料庫也被封裝到了虛擬機中,例如企業模型資料庫、製造資源資料庫、產品模型資料庫、專業知識資料庫、用戶信息資料庫等。虛擬化特有的優點使它能確保所有虛擬機中的關鍵業務連續可靠地運行。2.2虛擬化在製造業信息化應用框架中的作用虛擬化在製造業信息化中的應用主要有:
⑵ 3道java編程題,求解
packageTestPerson;
/**
*(1)編寫程序實現如下功能:已知Person類包含三個公共成員變數(姓名、性別、年齡)和一個構造方法,
*Student類是Person類的派生類,包含兩個新的公共成員變數(學號、班號)、兩個公共方法(修改年齡、顯示基本信息)及一個構造方法。
*在測試類Test1中,定義一組學生對象,並初始化他們的基本信息,然後依次輸出。
*/
publicclassTest1{
publicstaticvoidmain(String[]args){
Student[]student=newStudent[3];
student[0]=newStudent("小李","男",12,20181101,01);
student[1]=newStudent("小南","女",13,20001102,01);
student[2]=newStudent("小李","男",12,20181103,01);
for(Studentstu:student){
stu.showInformation();
}
}
}
classPerson{
publicStringname;
publicStringsex;
publicintage;
publicPerson(Stringname,Stringsex,intage){
super();
this.name=name;
this.sex=sex;
this.age=age;
}
}
classStudentextendsPerson{
publiclongstudentId;
publiclongclassId;
publicvoidsetAge(intage){
age=this.age;
}
publicvoidshowInformation(){
System.out.println("我的姓名是"+name+","+"我的性別是"+sex+","+"我的年齡是"+age
+"歲,"+"我的學號是"+studentId+","+"我的班號是"+classId+"班");
}
publicStudent(Stringname,Stringsex,intage,longstudentId,
longclassId){
super(name,sex,age);
this.studentId=studentId;
this.classId=classId;
}
}
不可否認,我現在是有點閑,所以我就幫你寫第一個吧,至於後面兩個,我就不寫了,看看還有沒有其他人有點閑時間,看緣分吧
運行結果:
我的姓名是小李,我的性別是男,我的年齡是12歲,我的學號是20181101,我的班號是1班
我的姓名是小南,我的性別是女,我的年齡是13歲,我的學號是20001102,我的班號是1班
我的姓名是小李,我的性別是男,我的年齡是12歲,我的學號是20181103,我的班號是1班
⑶ 如何用java實現fifo頁面置換演算法
[fifo.rar] - 操作系統中內存頁面的先進先出的替換演算法fifo
[先進先出頁面演算法程序.rar] - 分別實現最佳置換演算法(optimal)、先進先出(fifo)頁面置換演算法和最近最久未使用(LRU)置換演算法,並給出各演算法缺頁次數和缺頁率。
[0022.rar] - 模擬分頁式虛擬存儲管理中硬體的地址轉換和缺頁中斷,以及選擇頁面調度演算法處理缺頁中斷
[Change.rar] - 用java實現操作系統的頁面置換 其中包括 最佳置換演算法(Optimal)、先進先出演算法(First-in, First-out) 、最近最久不用的頁面置換演算法(LeastRecently Used Replacement)三種演算法的實現
[M_Management.rar] - 操作系統中內存管理頁面置換演算法的模擬程序,採用的是LRU置換演算法
[detail_of_44b0x_TCPIP.rar] - TCPIP 程序包載入到44b0x 的ADS1.2工程文件的說明書。說名了載入過程的細節和如何處理演示程序和代碼。演示代碼已經上傳,大家可以搜索
[.rar] - java操作系統頁面置換演算法: (1)進先出的演算法(fifo) (2)最近最少使用的演算法(LRU) (3)最佳淘汰演算法(OPT) (4)最少訪問頁面演算法(LFU) (註:由本人改成改進型Clock演算法) (5)最近最不經常使用演算法(NUR)
⑷ 新手學JAVA都要學哪些知識啊
這樣的問題,我已經回答了很多次,現在很多新手,特別是剛剛進入學生的學生,不知道該從哪裡入手,我整理了一些java的知識點,一共分為一個階段,273個技能點,第一階段、第二階段、第三階段、第四階段是必須要掌握的,第五階段和第六階段就是高薪、高職的保障,就說說想高薪必須得把後面兩個階段的給掌握了,
第一階段:java基本功修煉
1.認識計算機硬體
2.計算機組成原理
3.計算機軟體知識
4.計算機網路知識
5.常用網路應用操作
6.認識計算機病毒
7.邏輯訓練
8.初識Java
9.變數和數據類型
10.選擇結構
11.循環結構for
12.循環結構do-while
13.循環結構while
14.多重循環及程序調試
15.循環進階
16.一維數組及經典應用
17.二維數組
18.認識類與對象
19.方法及方法重載
20.封裝與繼承
21.方法重寫與多態
22.項目實戰-汽車租賃系統
23.抽象類和介面
24.異常
25.項目實戰-QuickHit
26.Java中的集合類型
27.List集合
28.Set集合
29.HashMap集合
30.Iterator
31.Collections演算法類及常用方法
32.enum
33.包裝類及裝箱拆箱
34.String、StringBuffer類常用方法操作字元串
35.Date、Calendar
36.Math類常用方法
37.IO/NIO
38.位元組輸入流(InputStream、FileInputStream、BufferedInputStream)
39.位元組輸出流(OutputStream、FileOutputStream、BufferedOutputStream)
40.字元輸入流(Reader、InputStreamReader、FileReader BufferedReader)
41.位元組輸出流(Writer、OutputStreamWriter、FileWriter、BufferedWriter)
42.文件復制
43.Serialize、Deserialize
44.職場晉升力:四象限時間管理與精力管理
45.多線程(Thread、Runnable)
46.ThreadLifeCycle
47.線程的調度
48.線程的同步和死鎖
49.ThreadPool
50.職場晉升力:團隊合作
51.Socket(TCP、UDP)
52.XML概念、優勢、規范
53.XML中特殊字元的處理
54.使用DOM讀取、添加、刪除、解析 XML數據
第二階段:javaweb開發
55.搭建和配置MySQL資料庫
56.資料庫增、刪、查、改語句
57.事務
58.視圖
59.資料庫備份與恢復
60.資料庫用戶管理
61.資料庫設計
62.項目實戰-銀行ATM存取款機系統
63.走進 HTML和CSS
64.列表表格及表單美化
65.CSS 高級操作
66.Bootstrap
67.CSS 組件
68.JavaScript面向對象
69.JavaScript判斷、循環
70.JavaScript閉包
71.JavaScript語法
72.Bootstrap綜合案例
73.HTML5、CSS3
74.jQuery基礎
75.jQuery基本操作
76.jQuery事件與特效
77.jQuery Ajax
78.jQuery插件
79.搭建Web 環境初識JSP
80.JSP九大內置對象
81.JSP實現數據傳遞和保存
82.JDBC
83.單例模式、工廠模式
84.MVC、三層模式
85.Commons-fileupload、CKEditor
86.分頁查詢
87.EL 與 JSTL
88.Servlet與Filter
89.Listener與MVC
90.Ajax 與 jQuery
91.jQuery的Ajax交互擴展
92.項目實戰—使用Ajax技術改進新聞發布系統
93.反射
94.Linux系統的安裝
95.在Linux中管理目錄和文件
96.在Linux中管理用戶和許可權
97.在Linux伺服器環境下安裝軟體和部署項目
98.職場晉升力:職場溝通
第三階段: 企業級框架開發
99. MyBatis 環境搭建
100. SQL 映射文件
101. 動態SQL
102. MyBatis 框架原理
103.SpringIOC
104.構造注入、依賴注入、註解
105. Spring 整合MyBatis(SqlSessionTemplate、MapperFactoryBean、事務
處理)
106. Spring 數據源(屬性文件、JNDI)、Bean 作用域
107. Spring 框架的運行原理
108.SpringMVC 體系概念
109.SpringMVC 之數據綁定、數據效驗、
110.SpringMVC 之視圖及視圖解析
111.SpringMVC 之文件上傳、本地化解析
112.SpringMVC 之靜態資源處理、請求攔截器、異常處理
113.Oracle資料庫環境搭建、安裝
114.Oracle資料庫 SQL、分頁、備份、還原
115.Hibernate 概念、依賴
116.HQL查詢語言
117.Hibernate 中配置關聯映射
118.HQL連接查詢與 Hibernate註解
119.Struts2概念、依賴
120.Struts2配置
121.OGNL表達式
122.Struts2攔截器
123.SSH框架整合
124.使用Maven構建項目
125.使用Struts2實現Ajax
126.Jsoup網路爬蟲
127.多線程網路爬蟲
128.反爬及反反爬策略
129.通用爬蟲設計
130.Echart圖表分析
131.IKAnalyzer分詞
132.企業框架項目實戰-代理商管理系統
133.企業框架項目實戰-SL 會員商城
134.企業框架項目實戰-會員管理系統
135.企業框架項目實戰-互聯網招聘信息採集分析平台
第四階段: 前後端分離開發
136.GitHub
137.Git基礎(checkout、pull、commit、push、merge等)
138.Git進階(多分支協作)
139.GitLab
140.IDEA的使用
141.Maven介紹(概念、倉庫、構建、命令)
142.使用Maven構建WEB項目
143.使用Maven構建多模塊項目
144.使用Maven搭建私服倉庫
145.Scrum框架介紹(三個角色、三個工件、四個會議)
146.ScrumTeam組建團隊
147.產品需求和用戶故事
148.每日立會
149.使用敏捷-Scrum方式開發管理實戰
150.前後端分離、分布式集群架構、垂直架構
151.SSM(SpringMVC+Spring+MyBatis)整合實戰
152.Git、Maven私服Nexus
153.第三方接入技術(微信、阿里)
154.MySQL電商實戰
155.Redis(緩存服務)
156.搜索引擎-Solr
157.集成APIDoc工具-Swagger
158.圖片自動化處理:Tengine+LUA+GraphicsMagic
159.手機、郵箱注冊
160.單點登錄 Token
161.OAuth2.0認證
162.Jsoup網路爬蟲(多線程爬蟲/代理 IP爬蟲)
163.ExecutorService線程池
164.IK中文分詞
165.Postman
166.ReactJS
167.webpack
168.職場晉升力:簡歷撰寫
169.程序猿面試寶典之項目面試
170.大型互聯網旅遊電商項目實戰-愛旅行
第五階段: 分布式微服架構開發
171.SpringBoot環境搭建
172.SpringBoot常用技能
173.SpringBoot整合Redis
174.SpringBoot整合Mybatis
175.微服務架構及架構設計
176.消息隊列
ActiveMQRabbitMQ
177.分布式事務
178.分布式鎖 Redis-setnx
179.Zookeeper注冊中心
180.基於 ActiveMQ實現高並發
181.Docker環境搭建
182.Docker鏡像加速
183.Docker容器管理
184.Docker鏡像管理
185.Docker容器文件備份
186.Dockerfile
187.Docker私服倉庫
188.真實互聯網高並發電商項目實戰-雙十一搶購
189.可視化監控 Portainer
190.DockerCompose 容器編排
191.DockerCompose擴容、縮容
192.DockerSwarm集群編排
193.Jenkins安裝、插件配置
194.Jenkins配置普通任務
195.Jenkins配置管道任務
196.Jenkins自動發布服務
197.Spring CloudEureka
198.Spring CloudFeign
199.Spring CloudRibbon
200.Spring CloudZuul
201.Spring CloudConfig
202.Spring CloudHystrix
203.Spring CloudSleuth
204.Spring BootAdmin
205.Eureka注冊原理探秘
206.SpringCloud 大坑解讀
207.Zipkin
208.Zipkin整合RabbitMQ
209.Zipkin整合MySQL
210.ELK日誌收集
211.Kafka
212.Elasticsearch映射管理
213.Elasticsearch查詢/復合查詢
214.Elasticsearch集群/集群規劃
215.Elasticsearch聚合
216.Elasticsearch集群監控
217.Elasticsearch插件
(Head/BigDesk)
218.Mycat讀寫分離
219.Mycat一主多從
220.Mycat多主多從
221.Mycat數據分片
222.Redis
223.Redis-Redlock
224.Elasticsearch環境搭建
225.Elasticsearch客戶端
226.Elasticsearch索引管理
227.Elasticsearch文檔管理
228.Mycat集群
229.Jmeter 並發測試
230.Jmeter 生成測試報告
231.微信登錄
232.微信支付
233.支付寶支付
234.網路地圖
235.Sonar本地檢測
236.Sonar+Jenkins線上檢測
237.CI/CD
238.SpringBoot改造愛旅行項目實戰
239.大型互聯網票務類電商項目實戰-大覓網
240.ES6概念(les、const)
241.ES6對象和數組
242.ES6函數擴展
243.VUE環境搭建
244.VUE.JS指令
245.VUE 交互
246.VUE 實例生命周期
247.VUE 組件
248.VUE項目環境配置及單文件組件
249.VUE 路由
第六階段:cc服務
250. Spring Cloud Gateway
251. Consul
252. Nacos
253. Eureka、Consu、lNacos、Zookeeper 對比分析
254. Prometheus + Grafana
255. ES 分布式存儲原理
256. NoSQL 資料庫解決方案(Redis、MongoDB)
257. OAuth2.0 認證( authorization code 模式)
258. OAuth2.0 認證( implicit 模式)
259. OAuth2.0 認證( resource owner password credentials 模式)
260.OAuth2.0認證( clientcredentials模式)
261.NAS/FastDFS分布式文件存儲
262.Python基礎
263.Python爬蟲
264. 大數據及 Hadoop 概述
265. 分布式文件系統 HDFS
266. 分布式計算框架MapRece
267. 分布式列式資料庫 HBase
268. Hadoop 綜合應用
269. 面試大局觀
270. 職業規劃
271. 項目面試
272. 具體業務場景化解決方案
273. 更多技術專題持續增加中
⑸ Java多線程之Atomic:原子變數與原子類
一 何謂Atomic?
Atomic一詞跟原子有點關系 後者曾被人認為是最小物質的單位 計算機中的Atomic是指不能分割成若幹部分的意思 如果一段代碼被認為是Atomic 則表示這段代碼在執行過程中 是不能被中斷的 通常來說 原子指令由硬體提供尺虧襲 供軟體來實現原子方法(某個線程進入該方法後 就不會被中斷 直到其執行完成)
在x 平台上 CPU提供了在指令執行期間對匯流排加鎖的手段 CPU晶元上有一條引線#HLOCK pin 如果匯編語言的程序中在一條指令前面加上前綴 LOCK 經過匯編以後的機器代碼就使CPU在執行這條指令的時候把#HLOCK pin的電位拉低 持續到這條指令結束時放開 從而把匯流排鎖住 這樣同一匯流排上別的CPU就暫時不能通過匯流排訪問內存了 保證了這條指陵兄令在多處理器環境中的原子性
二 ncurrent中的原子變數
無論是直接的還是間接的 幾乎 ncurrent 包中的所有類都使用原子變數 而不使用同步 類似 ConcurrentLinkedQueue 的類也使用原子變數直接實現無等待演算法 而類似 ConcurrentHashMap 的類使用 ReentrantLock 在需要時進行鎖定 然後 ReentrantLock 使用原子變數來維護等待鎖定的線程隊列
如果沒有 JDK 中的 JVM 改進 將無法構造這些類 這些改進暴露了(向類庫 而不是用戶類)介面來訪問硬體級的同步原語 然後 ncurrent 中的原子變數類和其他類向用戶類公開這些功能
ncurrent atomic的原子類
這個包裡面提供了一組原子類 其基本的特性就是在多線程環境下 當有多個線程同時執行這些類的實例包含的方法時 具有排他性 即當某個線程進入方法 執行其中的指令時 不會被其他線程打斷 而別的線程就像自旋鎖一樣 一直等到該方法執行完成 才由JVM從等待隊列中選擇一個另一個線程進入 這只是一種邏輯上的理解 實際上是藉助硬體的相關指令來實現的 不會阻塞線程(或者說只是在硬體級別上阻塞了) 其中的類可以分成 組
AtomicBoolean AtomicInteger AtomicLong AtomicReference
AtomicIntegerArray AtomicLongArray
AtomicLongFieldUpdater AtomicIntegerFieldUpdater AtomicReferenceFieldUpdater
AtomicMarkableReference AtomicStampedReference AtomicReferenceArray
其中AtomicBoolean AtomicInteger AtomicLong AtomicReference是類似空好的
首先AtomicBoolean AtomicInteger AtomicLong AtomicReference內部api是類似的 舉個AtomicReference的例子
使用AtomicReference創建線程安全的堆棧
Java代碼
public class LinkedStack<T> {
private AtomicReference<Node<T》 stacks = new AtomicReference<Node<T》()
public T push(T e) {
Node<T> oldNode newNode;
while (true) { //這里的處理非常的特別 也是必須如此的
oldNode = stacks get()
newNode = new Node<T>(e oldNode)
if (pareAndSet(oldNode newNode)) {
return e;
}
}
}
public T pop() {
Node<T> oldNode newNode;
while (true) {
oldNode = stacks get()
newNode = oldNode next;
if (pareAndSet(oldNode newNode)) {
return oldNode object;
}
}
}
private static final class Node<T> {
private T object;
private Node<T> next;
private Node(T object Node<T> next) {
this object = object;
this next = next;
}
}
}
然後關注欄位的原子更新
AtomicIntegerFieldUpdater<T>/AtomicLongFieldUpdater<T>/AtomicReferenceFieldUpdater<T V>是基於反射的原子更新欄位的值
相應的API也是非常簡
單的 但是也是有一些約束的
( )欄位必須是volatile類型的!volatile到底是個什麼東西 請查看
( )欄位的描述類型(修飾符public/protected/default/private)是與調用者與操作對象欄位的關系一致 也就是說調用者能夠直接操作對象欄位 那麼就可以反射進行原子操作 但是對於父類的欄位 子類是不能直接操作的 盡管子類可以訪問父類的欄位
( )只能是實例變數 不能是類變數 也就是說不能加static關鍵字
( )只能是可修改變數 不能使final變數 因為final的語義就是不可修改 實際上final的語義和volatile是有沖突的 這兩個關鍵字不能同時存在
( )對於AtomicIntegerFieldUpdater和AtomicLongFieldUpdater只能修改int/long類型的欄位 不能修改其包裝類型(Integer/Long) 如果要修改包裝類型就需要使用AtomicReferenceFieldUpdater
在下面的例子中描述了操作的方法
[java]
import ncurrent atomic AtomicIntegerFieldUpdater;
public class AtomicIntegerFieldUpdaterDemo {
class DemoData{
public volatile int value = ;
volatile int value = ;
protected volatile int value = ;
private volatile int value = ;
}
AtomicIntegerFieldUpdater<DemoData> getUpdater(String fieldName) {
return AtomicIntegerFieldUpdater newUpdater(DemoData class fieldName)
}
void doit() {
DemoData data = new DemoData()
System out println( ==> +getUpdater( value ) getAndSet(data ))
System out println( ==> +getUpdater( value ) incrementAndGet(data))
System out println( ==> +getUpdater( value ) decrementAndGet(data))
System out println( true ==> +getUpdater( value ) pareAndSet(data ))
}
public static void main(String[] args) {
AtomicIntegerFieldUpdaterDemo demo = new AtomicIntegerFieldUpdaterDemo()
demo doit()
}
}
在上面的例子中DemoData的欄位value /value 對於AtomicIntegerFieldUpdaterDemo類是不可見的 因此通過反射是不能直接修改其值的
AtomicMarkableReference類描述的一個<Object Boolean>的對 可以原子的修改Object或者Boolean的值 這種數據結構在一些緩存或者狀態描述中比較有用 這種結構在單個或者同時修改Object/Boolean的時候能夠有效的提高吞吐量
AtomicStampedReference類維護帶有整數 標志 的對象引用 可以用原子方式對其進行更新 對比AtomicMarkableReference類的<Object Boolean> AtomicStampedReference維護的是一種類似<Object int>的數據結構 其實就是對對象(引用)的一個並發計數 但是與AtomicInteger不同的是 此數據結構可以攜帶一個對象引用(Object) 並且能夠對此對象和計數同時進行原子操作
在本文結尾會提到 ABA問題 而AtomicMarkableReference/AtomicStampedReference在解決 ABA問題 上很有用
三 Atomic類的作用
使得讓對單一數據的操作 實現了原子化
使用Atomic類構建復雜的 無需阻塞的代碼
訪問對 個或 個以上的atomic變數(或者對單個atomic變數進行 次或 次以上的操作)通常認為是需要同步的 以達到讓這些操作能被作為一個原子單元
無鎖定且無等待演算法
基於 CAS (pare and swap)的並發演算法稱為 無鎖定演算法 因為線程不必再等待鎖定(有時稱為互斥或關鍵部分 這取決於線程平台的術語) 無論 CAS 操作成功還是失敗 在任何一種情況中 它都在可預知的時間內完成 如果 CAS 失敗 調用者可以重試 CAS 操作或採取其他適合的操作
如果每個線程在其他線程任意延遲(或甚至失敗)時都將持續進行操作 就可以說該演算法是 無等待的 與此形成對比的是 無鎖定演算法要求僅 某個線程總是執行操作 (無等待的另一種定義是保證每個線程在其有限的步驟中正確計算自己的操作 而不管其他線程的操作 計時 交叉或速度 這一限制可以是系統中線程數的函數 例如 如果有 個線程 每個線程都執行一次CasCounter increment() 操作 最壞的情況下 每個線程將必須重試最多九次 才能完成增加 )
再過去的 年裡 人們已經對無等待且無鎖定演算法(也稱為 無阻塞演算法)進行了大量研究 許多人通用數據結構已經發現了無阻塞演算法 無阻塞演算法被廣泛用於操作系統和 JVM 級別 進行諸如線程和進程調度等任務 雖然它們的實現比較復雜 但相對於基於鎖定的備選演算法 它們有許多優點 可以避免優先順序倒置和死鎖等危險 競爭比較便宜 協調發生在更細的粒度級別 允許更高程度的並行機制等等
常見的
非阻塞的計數器Counter
非阻塞堆棧ConcurrentStack
lishixin/Article/program/Java/gj/201311/27474