測試題14(答案解析13-17)

江湖@小小白發表於2020-11-02

day13測試

1. SpringMVC的執行流程

Dispatcher->HandlerMapping->HanderAdapter->Handler->ViewResolver->View

2. Integer a= 128 與 Integer b = 128相等嗎?

不相等,兩個不同的物件

3. Mybatis的一級、二級快取

  1. 一級快取
    Mybatis的一級快取是指Session快取。一級快取的作用域預設是一個SqlSession。Mybatis預設開啟一級快取。
    也就是在同一個SqlSession中,執行相同的查詢SQL,第一次會去資料庫進行查詢,並寫到快取中;第二次以後是直接去快取中取。
    當執行SQL查詢中間發生了增刪改的操作,MyBatis會把SqlSession的快取清空。
    一級快取的範圍有SESSION和STATEMENT兩種,預設是SESSION,如果不想使用一級快取,可以把一級快取的範圍指定為STATEMENT,這樣每次執行完一個Mapper中的語句後都會將一級快取清除。
  2. 二級快取
    Mybatis的二級快取是指mapper對映檔案。二級快取的作用域是同一個namespace下的mapper對映檔案內容,多個SqlSession共享。Mybatis需要手動設定啟動二級快取。
    二級快取是預設啟用的(要生效需要對每個Mapper進行配置),如想取消,則可以通過Mybatis配置檔案中的元素下的子元素來指定cacheEnabled為false。

4. 列舉工作中常用的幾個git命令?

	git init
	git add
	git commit
	git push
	git pull
	git clone
	git checkout
	git branch 分支名稱

5. 提交時發生衝突,你能解釋衝突是如何產生的嗎?你是如何解決的?

  1. 衝突是如何產生的
    我們都知道,Git的實現途徑是1棵樹。比如有一個節點樹(point1),
    我們基於point1進行開發,開發出了結點point2;
    我們基於point1進行開發,開發出了結點point3;
    如果我們在point2和point3內操作了同一類元素,那麼勢必會導致衝突的存在。
  2. 衝突是如何解決的?
    解決衝突通常使用如下的步驟即可:
    情況1 無衝突
    先拉取遠端的程式碼,更新原生程式碼。然後提交自己的更新程式碼即可。
    情況2 有衝突
    拉取遠端程式碼。存在衝突,會報錯。
    此時我們需要將原生程式碼暫存起來 stash;
    更新原生程式碼,將原生程式碼版本更新和遠端的程式碼一致即可;
    將暫存的程式碼合併到更新後的程式碼後,有衝突解決衝突(需要手動進行解決衝突);
    提交解決衝突後的程式碼。

6. Git中如果程式碼出現bug,你們是如何解決的?

開啟一個bug分支

7. 專案中常見的分支 有哪些?

master:主分支,對外發布
dev:開發分支
test:測試分支
bug:修復bug分支
feature:特性分支
hotfixes:熱線分支

8. String a = “ab”; String b = “a” + “b”; a == b 是否相等,為什麼?

相等,string 效能優化
String a =“a”+“b”+“c”+“d”;

9. volatile作用?

a、防止執行指令重排序
b、記憶體可見性

10. Java 中,Comparator 與Comparable 有什麼不同?

  1. Comparable 介面用於定義物件的自然順序,而 comparator 通常用於定義使用者定製的順序。Comparable 總是隻有一個,但是可以有多個 comparator 來定義物件的順序。
  2. Comparable是在集合內部定義的方法實現的排序,位於java.lang下。
    Comparator是在集合外部實現的排序,位於java.util下。

day14測試

1. CAS原理及作用

AtomicInteger
 public final int getAndIncrement() {
        return unsafe.getAndAddInt(this, valueOffset, 1);
  }
//var1:當前物件
//var2:原有記憶體值
//var4:需要自增的值
public final int getAndAddInt(Object var1, long var2, int var4) {
        int var5;
        do {
            var5 = this.getIntVolatile(var1, var2);//獲取當前記憶體值
        } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));
		if(var2 == var5){
			var5 = var5+var4;
			return true;
		}
		return false;
	
        return var5;
    }

CAS原理:獲取舊的記憶體值V,獲取當前記憶體值A, 只有當V==A,才將記憶體值修改成B
原子變數都是基於CAS實現的
AtomicInteger,AtomitLong
問題:ABA問題,通過版本號

A   a -> b->a
B	a->a->c
public class MyTest1  {
    public static void main(String[] args) {
        AtomicDemo demo = new AtomicDemo();
        for(int i=0; i<8; i++){
            new Thread(demo).start();
        }
    }
}

class AtomicDemo implements Runnable{
    //private int num = 0;
    private AtomicInteger num = new AtomicInteger(0);//原子變數

    @Override
    public void run() {
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(num.getAndIncrement());//原子操作
        //int temp;
        //temp = num;
        //temp = temp + 1;
        //num = temp

    }

}

2. 如何實現Ajax的跨域?

  1. 用代理伺服器代理
  2. 使用jsonp
  3. 服務端設定Request Header頭中Access-Control-Allow-Origin為指定可獲取資料的域名

3. String內部如何實現equals方法

  1. 首先是和自己比;
  2. 被比較的物件是否是String型別的;
  3. 再看它的長度是否相等;
  4. 比較它裡面的每一個字串;

4. ArrayList如何實現執行緒安全

  1. 使用synchronized關鍵字
  2. 使用Collections.synchronizedList();

​ 假如你建立的程式碼如下:List<Map<String,Object>> data=new ArrayList<Map<String,Object>>();

​ 那麼為了解決這個執行緒安全問題你可以這麼使用Collections.synchronizedList(),如:

​ List<Map<String,Object>> data=Collections.synchronizedList(new ArrayList<Map<String,Object>>());

5. 氣泡排序演算法

    //簡單選擇排序演算法
    private void selectSort(int[] datas){
        int length = datas.length;
        for(int i=0;i<length;i++){
            int min = i;
            for(int j=i+1;j<length;j++){
                int a = datas[min];
                int b = datas[j];
                if(a>b){//這裡為升序,如果要降序則直接這裡改成小於即可
                    min = j;
                }
            }
            int temp = datas[min];
            datas[min] = datas[i];
            datas[i] = temp;
            Log.i("sort", Arrays.toString(datas)+"  i:"+i);
        }
    }
    //氣泡排序演算法
    private void bubbleSort(int[] datas) {
        int length = datas.length;
        boolean flag;
        for (int i = 0; i < length - 1; i++) {
            flag = false;//使用flag對氣泡排序進行優化
            for (int j = 0; j < length - i-1; j++) {
                if (datas[j] > datas[j+1]) {//這裡為升序,如果要降序則直接這裡改成小於即可
                    int temp = datas[j];
                    datas[j] = datas[j+1];
                    datas[j+1] = temp;
                    flag = true;
                }
                Log.i("sort", Arrays.toString(datas) + "  j:" + j + "  length-i:" + (length - i));
            }
            if(!flag){//如果這裡flag為false,表示現在資料已經是有序的了,則可以直接退出for迴圈了
                break;
            }
        }
    }

6. Spring中事務在什麼情況下回失效。

​ a、try,catch
​ b、丟擲檢測異常
​ c、資料庫引擎MyISAM

7. 主鍵索引和普通索引的區別,為什麼主鍵要比普通快?

​ 資料庫的引擎是Innodb
​ 主鍵索引:索引的葉子節點中儲存行資料
​ 普通索引:索引的葉子節點儲存的是主鍵值,存在二次索引過程
​ 主鍵索引建議用自增

8. 什麼是髒讀、幻讀、不可重複讀?

問題描述
髒讀 (Dirty Read)一個事務讀取到另一個事務還未提交的資料。大於等於 read-commited 可防止
不可重複讀(Non-repeatable Read)一個事務內多次讀取一行資料的相同內容,其結果不一致。大於等於 repeatable-read 可防止
幻讀(Phantom Read)一個事務內多次讀取一張表中的相同內容,其結果不一致。serialized-read 可防止

9. 如何防止表單重複提交

1、JavaScript防止表單重複提交(主要用於網路延遲情況下使用者點選多次submit按鈕導致表單重複提交)

在jsp頁面中,新增JavaScript程式碼來防止表單的重複提交。主要是針對在網路延遲情況下使用者有時間點選多次submit按鈕導致表單重複提交,使用javascript控制Form表單只能提交一次。

2、**將提交按鈕設定為不可用,**讓使用者點選第一次提交之後,沒有機會點選第二次提交按鈕的機會。(也可以將提交按鈕隱藏起來,在點選第一次之後,將提交按鈕隱藏起來)

3、利用Session防止表單重複提交(主要用於表單提交之後,點選瀏覽器重新整理按鈕導致表單重複提交,以及點選瀏覽器返回按鈕退回到表單頁面後進行再次提交)

(1)表單頁面由servlet程式(伺服器端)生成,servlet為每次產生的表單頁面分配一個唯一的隨機標識號(Token令牌),並在FORM表單的一個隱藏欄位中設定這個標識號,同時在當前使用者的Session域中儲存這個標識號。
(2)當使用者提交FORM表單時,負責處理表單提交的serlvet得到表單提交的標識號,並與session中儲存的標識號比較,如果相同則處理表單提交,處理完後清除當前使用者的Session域中儲存的標識號。如果不一致,就是重複提交了,此時伺服器端就可以不處理重複提交的表單了。
(3)伺服器程式將拒絕使用者提交的表單請求情況如下:
1):儲存Session域中的表單唯一的標識號與表單提交的標識號不同
2):當前使用者的Session中不存在表單標識號
3):使用者提交的表單資料中沒有標識號欄位

(4)建立標識號

String token = TokenProccessor.getInstance().makeToken();

(5)在伺服器端使用Session儲存標識號

request.getSession().setAttribute(“token”,token);

(6)、在form表單中也就是JSP頁面中,使用隱藏域來儲存標識號(Token令牌)

10. 原生js ajax請求有幾個步驟?分別是什麼?

//第一步,建立XMLHttpRequest物件
var xmlHttp = new XMLHttpRequest();
function CommentAll() {
    //第二步,註冊回撥函式
    xmlHttp.onreadystatechange =callback1;
    //{
    //    if (xmlHttp.readyState == 4)
    //        if (xmlHttp.status == 200) {
    //            var responseText = xmlHttp.responseText;

    //        }
    //}
    //第三步,配置請求資訊,open(),get
    //get請求下引數加在url後,.ashx?methodName = GetAllComment&str1=str1&str2=str2
    xmlHttp.open("post", "/ashx/myzhuye/Detail.ashx?methodName=GetAllComment", true);

    //post請求下需要配置請求頭資訊
    //xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

    //第四步,傳送請求,post請求下,要傳遞的引數放這
    xmlHttp.send("methodName = GetAllComment&str1=str1&str2=str2");//"

}
//第五步,建立回撥函式
function callback1() {
    if (xmlHttp.readyState == 4)
        if (xmlHttp.status == 200) {
            //取得返回的資料
            var data = xmlHttp.responseText;
            //json字串轉為json格式
            data = eval(data);
            $.each(data,
                function(i, v) {
                    alert(v);
                });       
        }
}



//後臺方法
 private  void GetAllComment(HttpContext context)
        {

            //Params可以取得get與post方式傳遞過來的值。
            string methodName = context.Request.Params["methodName"];

            //QueryString只能取得get方式傳遞過來的值。
            string str1 = context.Request.Form["str1"];

            //取得httpRequest傳來的值,包括get與post方式
            string str2 = context.Request["str2"];

            List<string> comments = new List<string>();

            comments.Add(methodName);

            comments.Add(str1);

            comments.Add(str2);


            //ajax接受的是json型別,需要把返回的資料轉給json格式
            string commentsJson = new JavaScriptSerializer().Serialize(comments);
            context.Response.Write(commentsJson);
        }

day15測試

1. ArrayList和Vector的區別

區別:

​ ArrayList非安全,Vector安全
​ 擴容ArrayList 1.5倍 Vector 2倍

2. List, Set, Map三個介面,存取元素時,各有什麼特點?

​ List:有序
​ Set:無序
​ Map:key->value(key 不可以重複;value 可以重複)

3. Collection 和 Collections的區別

  1. Collection是集合類的上級介面,繼承與他的介面主要有Set 和List.
  2. Collections是針對集合類的一個幫助類,他提供一系列靜態方法實現對各種集合的搜尋、排序、執行緒安全化等操作

4. HashMap的實現原理

​ 陣列+連結串列+紅黑樹

5. volatile關鍵字的作用?能否保證執行緒安全?

不能保證執行緒安全

  1. 保持可見性

禁止進行指令的重排序(volatile關鍵字能確保變數線上程中的操作不會被重排序而是按照程式碼中規定的順序進行訪問) 有序性

  1. 並不能保證原子性

在使用volatile關鍵字時要慎重,並不是只要簡單型別變數使用volatile修飾,對這個變數的所有操作都是原來操作,當變數的值由自身的上一個決定時,如n=n+1、n++等,volatile關鍵字將失效,只有當變數的值和自身上一個值無關時對該變數的操作才是原子級別的,如n = m + 1,這個就是原級別的。所以在使用volatile關鍵時一定要謹慎,如果自己沒有把握,可以使用synchronized來代替volatile。

6. 高併發應該使用什麼Map?

Hashtable
ConcurrentHashMap

7. 什麼是樂觀鎖和悲觀鎖?

簡單理解下悲觀鎖:當一個事務鎖定了一些資料之後,只有噹噹前鎖提交了事務,釋放了鎖,其他事務才能獲得鎖並執行操作。

樂觀鎖是首先假設資料衝突很少,只有在資料提交修改的時候才進行校驗,如果衝突了則不會進行更新。

8. 資料庫的三大正規化

1NF:一個表中每個欄位都是獨立

2NF:表中的每一行資料都是唯一的,所有非主鍵欄位都和主鍵欄位關聯,不能存在間接依賴

3NF:表中不能存在傳遞依賴

9. synchronized鎖是公平鎖還是非公平鎖

非公平鎖

10. 十進位制數12的二進位制表示應該是?

1100

day16測試

1. ConcurrentHashMap在JDK1.8之後結構做了哪些改進?

HashMap
Hashtable
CocurrentHashMap->分段鎖segement(RetreenLock)->synchronized+cas+紅黑色

改進一:取消segments欄位,直接採用transient volatile HashEntry<K,V> table儲存資料,採用table陣列元素作為鎖,從而實現了對每一行資料進行加鎖,進一步減少併發衝突的概率。

改進二:將原先table陣列+單向連結串列的資料結構,變更為table陣列+單向連結串列+紅黑樹的結構。對於hash表來說,最核心的能力在於將key hash之後能均勻的分佈在陣列中。如果hash之後雜湊的很均勻,那麼table陣列中的每個佇列長度主要為0或者1。但實際情況並非總是如此理想,雖然ConcurrentHashMap類預設的載入因子為0.75,但是在資料量過大或者運氣不佳的情況下,還是會存在一些佇列長度過長的情況,如果還是採用單向列表方式,那麼查詢某個節點的時間複雜度為O(n);因此,對於個數超過8(預設值)的列表,jdk1.8中採用了紅黑樹的結構,那麼查詢的時間複雜度可以降低到O(logN),可以改進效能。

2. Spring Bean作用域的有哪些?

singleton
prototype
request
session
application

3. Spring中Bean的注入方式有哪些?

​ set注入
​ 構造注入
​ 自動注入

4. 如何獲取自動生成的(主)鍵值?

last_insert_id()

5. 瞭解過哪些JDK8的新特性,舉例描述下相應的特性?

​ 介面中定義Default和static
​ 函式式介面@FunctionInterface
​ lambda表示式 ()->{}
​ stream流
​ 日期時間
​ Optional

6. hashCode的作用?

  1. Java中的集合(Collection)有兩類,一類是List,再有一類是Set。前者集合內的元素是有序的,元素可以重複;後者元素無序,但元素不可重複。 要想保證元素不重複,可兩個元素是否重複應該依據什麼來判斷呢?這就是Object.equals方法了。但是,如果每增加一個元素就檢查一 次,那麼當元素很多時,後新增到集合中的元素比較的次數就非常多了。也就是說,如果集合中現在已經有1000個元素,那麼第1001個元素加入集合時,它 就要呼叫1000次equals方法。這顯然會大大降低效率。 於是,Java採用了雜湊表的原理。雜湊演算法也稱為雜湊演算法,是將資料依特定演算法直接指定到一個地址上。這樣一來,當集合要新增新的元素時,先呼叫這個元素的hashCode方法,就一下子能定位到它應該放置的物理位置上。如果這個位置上沒有元素,它就可以 直接儲存在這個位置上,不用再進行任何比較了;如果這個位置上已經有元素了,就呼叫它的equals方法與新元素進行比較,相同的話就不存了;不相同,也就是發生了Hash key相同導致衝突的情況,那麼就在這個Hash key的地方產生一個連結串列,將所有產生相同hashcode的物件放到這個單連結串列上去,串在一起。所以這裡存在一個衝突解決的問題(很少出現)。這樣一來實際呼叫equals方法的次數就大大降低了,幾乎只需要一兩次。 所以,Java對於eqauls方法和hashCode方法是這樣規定的:
    1、如果兩個物件相等,那麼它們的hashCode值一定要相等;
    2、如果兩個物件的hashCode相等,它們並不一定相等。
    上面說的物件相等指的是用eqauls方法比較。

7. 深拷貝和淺拷貝區別

深拷貝和淺拷貝都是物件拷貝

  1. 深拷貝是一個整個獨立的物件拷貝,深拷貝會拷貝所有的屬性,並拷貝屬性指向的動態分配的記憶體。當物件和它所引用的物件一起拷貝時即發生深拷貝。深拷貝相比於淺拷貝速度較慢並且花銷較大。
  2. 被複制物件的所有變數都含有與原來的物件相同的值,而所有的對其他物件的引用仍然指向原來的物件。即物件的淺拷貝會對“主”物件進行拷貝,但不會複製主物件裡面的物件。”裡面的物件“會在原來的物件和它的副本之間共享。

8. JAVA遍歷Map的方式有幾種

        for(String key :map.keySet()){
            System.out.println(key+":"+map.get(key));
        }

        for(String val : map.values()){
            System.out.println(val);
        }

        for(Map.Entry<String,String> e : map.entrySet()){
            System.out.println(e.getKey()+":"+e.getValue());
        }

        Set<Map.Entry<String, String>> set =   map.entrySet();
        Iterator<Map.Entry<String, String>> iterator = set.iterator();
        while(iterator.hasNext()){
            Map.Entry<String, String> next = iterator.next();
            System.out.println(next.getKey()+":"+next.getValue());
        }

9. 怎樣將GB2312編碼的字串轉換為ISO-8859-1編碼的字串?

String newStr = new String(str.getBytes(“GB2312”), “ISO-8859-1”);

10. forward 和 redirect 的區別?

(1). 從位址列顯示來說

  1. forward是伺服器請求資源,伺服器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然後把這些內容再發給瀏覽器.瀏覽器根本不知道伺服器傳送的內容從哪裡來的,所以它的位址列還是原來的地址.
  2. redirect是服務端根據邏輯,傳送一個狀態碼,告訴瀏覽器重新去請求那個地址.所以位址列顯示的是新的URL.

(2). 從資料共享來說

  1. forward:轉發頁面和轉發到的頁面可以共享request裡面的資料.
  2. redirect:不能共享資料.

(3). 從運用地方來說

  1. forward:一般用於使用者登陸的時候,根據角色轉發到相應的模組.
  2. redirect:一般用於使用者登出登陸時返回主頁面和跳轉到其它的網站等.

(4). 從效率來說

  1. forward:高.
  2. redirect:低.

day17測試

1. Shiro認證和授權的流程?

​ 主體-》SecurityManager-》認證器(Authentication)-》Realm實現具體認證過程
​ 主體-》SecurityManager-》授權器(Authorization)-》Realm實現具體的授權過程

2. 傳遞一個集合作為引數給函式時,如何能確保函式將無法對其進行修改?

  1. final
  2. Collections.unmodifiableCollection(Collection);
  3. 如何修改集合則丟擲UnsupportedOperationException

3. 哪一個List實現了最快插入?

LinkedList

4. Java的concurrent包中的有哪些API?

​ Lock
​ 原子變數:AtomicInteger
​ ConcurrentHashMap
​ Executor

5. 怎麼判斷物件是否可以被回收?

  1. 可達性分析
  2. 引用計算

6. 一張自增表裡面總共有 7 條資料,刪除了最後 2 條資料,重啟 mysql 資料庫,又插入了一條資料,此時 id 是幾?

​ InnoDB->記憶體->6
​ MyISAM->檔案->8

7. AQS是什麼?

AQS:AbstractQueuedSynchronizer

抽象佇列同步器,實現鎖機制(CAS+FIFO)
ReentrantLock

8. java的基礎型別和位元組大小

1. 基本資料型別(布林)

型別位元組取值範圍描述
boolean1位元組true/false僅可描述“真”或者“假”
  1. 可直接賦值true/false

  2. 也可以直接賦值一個結果為true/false的表示式

    boolean result = 3 > 2;
    //注:Java中的boolean不能參與算術運算
    

2. 基本資料型別(字元)

型別位元組取值範圍(無符號數)字元編碼
char2位元組0~65535Unicode字符集(萬國碼)
  1. char :character

    1). 應額嗯對應的ASCCI編碼,中文或者其他國家語言對應Unicode編碼。

     2). 每個字元都有對應的整數變現形式。
    
     3). 賦值:char c1 = 'A';  或者   char c2 = 65;    或者     char c3 = '\u0041';
    
  2. Unicode 字符集支援ASCII編碼(美國標準資訊交換碼)。

  3. Unicode中每個字元都對應一個十進位制整數,從而可以使用多種方式賦值。

  4. 字元賦值:char c1 = ‘A’;(通過’'描述字元賦值)

  5. 整數賦值:char c2 = 65;(通過十進位制65在字符集中對應的字元賦值)

  6. 進位制賦值:char c3 = ‘\u0041’;(通過十六進位制數41在字符集中對應的字元賦值)

3. 轉義字元

  1. 如果需要在程式中輸出一個單引號字元,該如何完成?

  2. package demo;
    
    public class TestChar {
    	public static void main(String[] args) {
    		char c = '\'';
    		System.out.println(c);
    	}
    }
    
轉義字元描述
\n換行符
\t縮排(製表符)
\\反斜線
\’單引號
\’’雙引號
class Demo {
	public static void main(String[] args) {
		
		char c1 = 'A';
		
		char c2 = 'B';
		
		char c3 = 67;
		
		char c4 = '好';
		
		//char c5 = "K";
		
		/*  Demo.java:12: 錯誤: 不相容的型別: String無法轉換為char
                char c5 = "K";
                          ^
			1 個錯誤
		*/
		
		char c6 = '\u0041';
		
		char c7 = '\'';//轉義字元
		
		System.out.println(c1);
		
		System.out.println(c2);
		
		System.out.println(c3);
		
		System.out.println((int)c4);
		
		/*System.out.println(c5);
		Demo.java:30: 錯誤: 找不到符號
                System.out.println(c5);
                                   ^
		符號:   變數 c5
		位置: 類 Demo
		1 個錯誤
		*/
		System.out.println(c6);
		
		System.out.print("Hello\n");
		
		System.out.print("world");
	}
}
整數型別
型別位元組取值範圍(二進位制)取值範圍(十進位制)
byte1位元組-27~27-1-128~127
short2位元組-215~215-1-32768~32767
int4位元組-231~231-1-2147483648~2147483647
long8位元組-263~263-1-9223372036854775808~9223372036854775807

小數/浮點數

型別位元組負數取值範圍
float4位元組-3.4E+38~1.4E-451.4E-45~3.4E+38
double8位元組-1.7E+3.8~-4.9E-3244.9E-45~3.4E+38

9. CAS機制是什麼,如何解決ABA問題。

ABA問題,簡單描述就是存在一個變數值為A,第一個執行緒把變數值從A改成了B,第二個執行緒又把變數值從B改成了A,這樣,後面的執行緒讀取這個變數的時候就會以為變數值沒有發生過任何變化。

  1. CAS概述

CAS:Compare and Swap,即比較再交換,它是一條CPU併發原語。
它的功能是判斷記憶體某個位置的值是否為預期值,如果是,則更改為最新值,這個過程是原子的。

CAS併發原語體現在Java語言中的sun.misc.Unsafe類中的各個方法,呼叫Unsafe類中的CAS方法,JVM會幫我們實現CAS彙編指令,它是一種完全依賴於硬體的功能,通過它實現了原子操作,再次強調,由於CAS是一種系統原語,原語屬於作業系統用語的範疇,是由若干條指令組成的,用於完成某個功能的一個過程,並且原語的執行是連續的,在執行過程中不允許被中斷,也就是說CAS是一條CPU的原子指令,不會造成所謂的資料不一致問題。

jdk5增加了併發包java.util.concurrent.*,其下面的類使用CAS演算法實現了區別於synchronzied同步鎖的一種樂觀鎖。JDK 5之前Java語言是靠synchronized關鍵字保證同步的,這是一種獨佔鎖,也是是悲觀鎖。

對CAS的理解,CAS是一種無鎖演算法,CAS有3個運算元,記憶體值V,舊的預期值A,要修改的新值B。當且僅當預期值A和記憶體值V相同時,將記憶體值V修改為B,否則什麼都不做。

10. http1.0和http1.1有什麼區別

長連線: 長連線(HTTP persistent connection ,也有翻譯為持久連線),指資料傳輸完成了保持TCP連線不斷開(不發RST包、不四次握手),等待在同域名下繼續用這個通道傳輸資料;相反的就是短連線。
Host域
頻寬優化
訊息傳遞
快取

相關文章