日韩在线首页I俄罗斯pornI男女猛烈激情XX00高潮动态I超碰免费97I乱人伦99久久I欧美日韩成人一区I最新日韩视频在线观看I粉嫩AV四季AV绯色AVI五月导航

×
新網 > 虛擬主機 > 正文

手寫JAVA虛擬機(二)——實現java命令行

  • 作者:新網
  • 來源:新網
  • 瀏覽:100
  • 2018-04-26 15:48:45

咱們都知道,咱們編譯.java并運轉.class文件時,需求一些java指令,如最簡略的helloworld程序。java初學者可以看一下下面的教程。

   t0168e141ebeb2a01ea.jpg

<div>  咱們都知道,咱們編譯.java并運轉.class文件時,需求一些java指令,如最簡略的helloworld程序。java初學者可以看一下下面的教程。
  這兒的程序最好不要加包名,因為加了包名的話編譯和運轉需求有所改動。
  看這兒的指令。javac為編譯指令,咱們知道java的特點是一次編譯,處處運轉。這兒的編譯指的就是javac,關于java程序即.java文件,先要用javac編譯成字節碼。然后將字節碼(.class文件)放到java虛擬機中運轉,即上圖中的java HelloWorld,java虛擬機把字節碼翻譯成對應機器上的機器指令,再由機器來履行詳細的機器指令。也就是說java程序員是直接與java虛擬機交互,簡介與機器交互。所以虛擬機完結的是java指令,也就是咱們要完結的是java這個指令的功用。
  那么咱們把榜首個方針定為,完結簡略的指令行。即咱們經過指令行能夠輸入一些內容,虛擬機讀取之后能夠給必定的反應。
  GO言語中有兩個和指令行相關的包,分別是os和flag(java中以類庫即jar文件導入,go中直接以包的辦法導入)。
  首先在GOPATH目錄下的src里邊新建一個jvmgo文件夾作為咱們的作業空間目錄,jvmgo里邊再新建一個ch01為咱們的榜首個方針源碼文件夾,增加cmd.go文件。
  在cmd.go里邊輸入如下代碼(因為博客園的增加代碼辦法不支持go言語上色,所以選用C言語上色,高亮可能不太正確)
  package main import "flag" import "fmt" import "os" //界說Cmd結構體 type Cmd struct{ helpFlag bool versionFlag bool cpOption string class string args []string } //解析指令行參數 func parseCmd() *Cmd { cmd:=&Cmd{} //將printUsage函數傳給flag.Usage flag.Usage=printUsage //設置各種解析的選項 flag.BoolVar(&cmd.helpFlag, "help", false, "print help message") flag.BoolVar(&cmd.helpFlag, "?", false, "print help message") flag.BoolVar(&cmd.versionFlag, "version", false, "print version and exit") flag.StringVar(&cmd.cpOption, "classpath", "", "classpath") flag.StringVar(&cmd.cpOption, "cp", "", "classpath") //一切選項設置完結后調用flag.Parse解析一切選項,假如Parse失利,則調用flag.Usage打印協助信息 flag.Parse() //調用flag.Args函數捕獲未被解析的參數,榜首個參數為主類名,后邊的為傳遞給主類的參數 args:=flag.Args() if len(args)>0{ cmd.class=args[0] cmd.args=args[1:] } return cmd } func printUsage() { fmt.Printf("Usage:%s[-options] class [args...] ",os.Args[0]) }
  榜首行為包名,main包,接著引入了三個包os,flag,fmt。os和flag都是處理指令行所需的包,fmt類似于C言語的printf和scanf等格式化IO。再往下界說了一個結構體Cmd,用來這個數據結構來格式化存儲輸入的指令行信息。helpFlag參數為指令行是否懇求help,versionFlag參數為指令行是否懇求version,cpOption為指令行傳入的classpath即方針.class文件地點文件夾,class為指令行傳入的.class文件名(不包括.class),args為指令行傳入的其他參數。
  緊接著是一個parseCmd函數(go言語有函數和辦法之分,辦法調用需求receiver,函數調用則不需求 ),回來值為*Cmd,用來解析cmd傳過來的參數。該函數里邊先聲明一個cmd并給這個cmd賦值一個新建的Cmd對象。go言語中的“:=”為聲明并賦值,而"="為賦值。先把printUsage的函數賦值給flag.Usage,然后調用flag設置需求解析的選項,悉數解析結束,調用Parse函數解析一切選項。解析成功則結束,解析失利則調用printUsage打印到控制臺。
  flag.Args能夠捕獲其他沒有被解析的參數。上面解析成功之后,榜首個參數就是主類名,剩余的就是傳給主類的參數。
  東西類編寫完結,下一個是
  主函數。先上主函數代碼:
  package main import "fmt" func main() { //調用parseCmd解析指令行參數 cmd:=parseCmd() if cmd.versionFlag{ //輸入了-version選項 fmt.Println("version 0.0.1") }else if cmd.helpFlag||cmd.class==""{ //輸入了-help選項 printUsage() }else{ //發動jvm stratJVM(cmd) } } func stratJVM(cmd *Cmd){ fmt.Printf("classpath:%s class:%s args:%v ", cmd.cpOption,cmd.class,cmd.args) }
  跟java類似,在go里邊main是一個特殊的包,go程序的入口就是main函數,可是不接受任何參數,也不能有回來值。main函數先調用parseCmd解析指令行參數,假如是-version則回來版本號,假如是-help則回來協助信息,假如是其他則發動jvm,這兒用一些輸出信息“偽裝”發動了jvm,真正的jvm代碼后邊會加上。
  至此,對指令行的解析作業悉數完結。先展現一下整個作業目錄的結構,不然后邊編譯運轉的時分會犯錯。
  咱們的作業目錄是D盤下的JVM里的goWorkSpace,再下面src,jvmgo,ch01,ch01里邊包括的是咱們的go文件。
  來測驗一下,翻開一指令行,輸入go install jvmgoch01。這個指令是運用go.exe來install文件,這個文件存在于GOPATH下面的文件夾(jvmgoch01中),結果如圖:
  然后在作業空間(GOPATH)的bin文件夾中就多出了一個ch01.exe。
  在此處翻開指令行。能夠進行一些操作:
  到這兒,咱們的指令行東西就完結了,盡管還沒有觸及真正的虛擬機規劃,但這也是虛擬機運轉的重要一步,后邊會逐漸介紹虛擬機的規劃。
  同理,如果在unlock操作中,就是釋放了鎖,然后unpark,這兒就不詳細講了。
  咱們知道HashMap不是一個線程安全的容器,最簡略的辦法使HashMap變成線程安全就是運用Collections.synchronizedMap,它是對HashMap的一個包裝
  public static Map m=Collections.synchronizedMap(new HashMap());
  同理關于List,Set也供給了類似辦法。
  可是這種辦法只適合于并發量比較小的狀況。
  咱們來看下synchronizedMap的完成
  它會將HashMap包裝在里面,然后將HashMap的每個操作都加上synchronized。
  由于每個辦法都是獲取同一把鎖(mutex),這就意味著,put和remove等操作是互斥的,大大減少了并發量。
  下面來看下ConcurrentHashMap是怎么完成的
  在 ConcurrentHashMap內部有一個Segment段,它將大的HashMap切分成若干個段(小的HashMap),然后讓數據在每一段上Hash,這樣多個線程在不同段上的Hash操作一定是線程安全的,所以只需要同步同一個段上的線程就可以了,這樣完成了鎖的別離,大大增加了并發量。
  在運用ConcurrentHashMap.size時會比較費事,由于它要計算每個段的數據和,在這個時分,要把每一個段都加上鎖,然后再做數據計算。這個就是把鎖別離后的小小壞處,可是size辦法應該是不會被高頻率調用的辦法。
  在完成上,不運用synchronized和lock.lock而是盡量運用trylock,一起在HashMap的完成上,也做了一點優化。這兒就不提了。
 

免責聲明:本文內容由互聯網用戶自發貢獻自行上傳,本網站不擁有所有權,也不承認相關法律責任。如果您發現本社區中有涉嫌抄襲的內容,請發送郵件至:operations@xinnet.com進行舉報,并提供相關證據,一經查實,本站將立刻刪除涉嫌侵權內容。

免費咨詢獲取折扣

Loading
主站蜘蛛池模板: 久草高清视频 | 农夫成人网 | 成人极品视频 | 夜夜综合网 | 9lporm自拍视频区 | 中文字幕第66页 | 日本无遮挡大尺度床戏网站 | 少妇被粗大的猛烈进出动视频 | 欧美福利视频网站 | 在线播放国产精品三级网 | 国产av一区二区三区天堂综合网 | 99精品一区二区 | 三a大片 | 亚洲天堂在线视频观看 | 国内精品免费久久久久电影院97 | eeuss鲁片一区二区三区69 | 性插插视频 | 日本一区二区免费看 | 亚洲视频在线观看2018 | 久久精品aaaaaa羞羞羞 | 久久久欧美精品激情 | 精品亚洲a∨无码一区二区三区 | 中文字幕 亚洲精品 第1页 | 亚洲国产婷婷综合在线精品 | 91视频地址| 日本精品999 | 天堂俺去俺来也www色官网 | 调教女少妇二区三区视频 | 国产午夜片 | 精品视频中文字幕 | 日本精品777777免费视频 | 欧美午夜一区二区三区免费大片 | 国产精品无码无需播放器 | 久在线精品视频线观看 | 狠狠cao2020高清视频 | 亚洲综合精品 | 国产精品丝袜综合区旗袍 | 又色又爽又黄又刺激免费 | 粉嫩小泬无遮挡久久久久久 | 黑色丝袜老师色诱视频国产 | 久久久久国产免费 | 男人扒开女人腿桶到爽免费 | 欧美成 人版在线观看 | 91一区二区三区久久久久国产乱 | 天天躁日日躁狠狠躁婷婷 | 亚洲第一黄网 | 999久久久免费精品播放 | 色av一区二区 | 亚洲熟妇av一区二区三区浪潮 | 国产av福利久久 | 久久国产精品福利一区二区三区 | 性久久久久久 | 裸体性做爰免费视频网站 | 日日澡夜夜澡人人高潮 | 国产午夜福利100集发布 | av瑟瑟 | 欧美精品国产一区二区 | 久久五 | 最近的中文字幕在线看视频 | 欧美熟妇丰满肥白大屁股免费视频 | 粉嫩高中生无码视频在线观看 | 亚洲精品9 | 岳帮我囗交吞精69 | 亚洲天天做 | 国产免费大片 | 菠萝蜜视频在线观看入口 | 国内精品久久久久伊人aⅴ 在线成人欧美 | 亚洲愉拍自拍欧美精品app | 免费无码午夜福利片 | 欧美3p激情一区二区三区猛视频 | 成人高潮片免费网站 | 国产精品一色哟哟哟 | www日本tv| 国产偷国产偷亚洲高清人 | 人妻少妇精品久久久久久 | 精品久久久无码人妻中文字幕 | 国产成人免费永久在线平台 | 99热成人精品国产免费 | 日韩免费无码视频一区二区三区 | 欧美日韩在线视频播放 | 精品国产综合成人亚洲区2022 | www.亚洲色图 | 中文字幕有码无码人妻在线 | 少妇白浆高潮无码免费区 | 女明星黄网站色视频免费国产 | 在线观看精品国产 | 华人在线亚洲欧美精品 | 中文字幕制服诱惑 | 久久伊人少妇熟女大香线蕉 | 99riav国产精品视频 | 国产真人作爱免费视频道歉 | 人妻在客厅被c的呻吟 | 污污视频网站在线 | 亚洲男女视频 | 亚洲国产精品嫩草影院永久 | 久久久国产99久久国产久一 | 伊人久久五月天 | av在线播放免费观看 | 亚洲国产精品一区二区成人片不卡 |