aaaa成人_日本一道本在线视频_国产高潮流白浆喷水在线观看_韩国专区福利一区二区_一区二区不卡视频_看全色黄大色黄大片女图片第一次

×
新網 > 虛擬主機 > 正文

手寫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
主站蜘蛛池模板: 免费黄色大片 | 国产精品自产拍在线观看 | 久久综合狠狠综合 | 午夜片在线| 国产美女视频a级做爰色戎 一本久久A精品一区二区 | 浴室洗澡偷拍一区二区 | 国产免费一级大片 | 亚洲成a人片777777久久 | 中文字幕免费亚洲 | 欧美日韩视频免费观看 | 十八禁羞羞视频爽爽爽 | 男人一级片 | 欧美熟妇色xxxx | 在线观看欧美日韩国产 | a级片在线播放 | 在线成人av | 国产精品夜间视频香蕉 | 一级片xxxx | 国产精品免费久久久久久久久久中文 | 无码被窝影院午夜看片爽爽JK | 毛片基地视频 | 娇妻与公h喂奶 | 日本少妇人妻XXXXⅩ18 | 国产精品推荐天天看天天爽 | 国产精品偷伦免费视频观看的 | 日韩在线高清 | 精品一区亚洲 | JLZZJLZZ全部女高潮 | 男人操女人高清视频 | 日日干狠狠操 | 裸体久久女人亚洲精品 | 久久久妇女国产精品影视 | 国产男女乱淫视频高清免费 | 99久久国产免费大片 | 偷拍视频网址 | 密桃av | 久久国产a级久久美女毛片 日韩激情无码一级毛片 | 免费一级特黄特色毛片久久看 | 国内在线一区 | xxx.在线观看| 高级毛片 |