1. 程式人生 > >筆試錯題記錄2

筆試錯題記錄2

####選擇題

1.在Java中哪個修飾詞可以體現變數的原子性volatile

  1. static 修飾符表示變數被所有例項共享,變數屬於類
  2. final 修飾符表示變數的值是不能改變的
  3. transient 修飾的變數在類例項的序列化處理過程中會被忽略。這個變數是短暫的變數,不能貫穿物件的序列化和反序列化。如果類中有Logger例項,那麼Logger例項也是不能被序列化的。
  4. volatile 具有兩層含義。但是volatile是無法保證原子性的。
  • 保證不同執行緒對這個變數操作時的可見性,即一個執行緒修改了某個變數的值,這個值對其他執行緒來說是立即可見的。
  • 禁止進行指令的重排序。

原子性。 原子性的意思是一個操作要麼執行,要麼不執行,在執行的過程中不會被打斷。Java中原子性適用於除了long和double的原始資料型別的"簡單操作"。從記憶體中讀寫除了long和double的原始資料型別都是原子操作。但是變數之間的相互賦值不是原子操作。

int a = 1;   //是原子操作
int b = 1;   //原子操作
int c = a;   //這一步中需要從記憶體中取出a的值再賦值給c。這是兩步操作。

可見性 可見性是指當多個執行緒訪問同一個變數的時候,一個執行緒修改了一個變數的值,那麼其他執行緒立即可以看到變數值的變化。

有序性 即程式執行的順序按照程式碼先後順序執行。

int a =1;    //語句1
Int b =2;    //語句2

雖然語句1看上去在語句2的前面,但是在執行的時候不一定是語句1先執行。因為可能會發生指令重排序。指令重排序是指處理器為了提高程式執行效率,可能會對輸入程式碼進行優化,它不保證程式中各個語句的執行先後順序

同程式碼中的先後順序一致,但是它保證程式最終執行結果和程勳順序執行的結果是一致的。但是處理器在進行重排序的時候,考慮指令之間的資料依賴性。

2.Java中的垃圾處理機制 垃圾的定義:如果物件實體沒有引用指向,那麼儲存該實體的記憶體就是垃圾。

3.多執行緒之間有兩種關係:同步互斥

4.大端模式是指資料的高位元組儲存在記憶體的低地址中。這種模式有點類似於把資料當字串處理,地址由小向大增加,資料從高位往低位放。 小端模式是指資料的高位元組儲存在記憶體的高地址中。這種儲存模式把地址位高低和資料位權有效地結合起來,高地址部分權值高,低地址部分權值低。

5.動態連結:動態就是不對那些組成程式的目標檔案進行連結,等到程式執行時才進行連結。把連結的過程推遲到了執行時再進行。 靜態連結的缺點

  1. 同一個模組被多個模組連結時,那麼這個模組在磁碟和記憶體中都有多個副本,導致很大一部分空間被浪費。
  2. 當程式的任意一個模組發生變化時,整個程式都要更新連結、釋出給使用者。

連結檔案

  1. 在Linux中,ELF的動態連結檔案被稱為動態共享物件(Dynamic shared object,DSO),是以**.so**為副檔名結尾的檔案。
  2. 在Windows中,EP的動態連結檔案被稱為動態連結庫(Dynamic linked library,DLL),以**.dll**為副檔名的檔案。