1. 程式人生 > >java面試,中高階部分

java面試,中高階部分

1、為什麼說Redis是單執行緒的以及Redis為什麼這麼快。
Redis為什麼這麼快:
Redis不使用表,是基於Key-Value字典方式儲存的 資料庫,由C語言編寫。他的資料庫不會預定義或者強制去要求使用者對Redis儲存的不同資料進行關聯。
資料庫的工作模式按儲存方式可分為:硬碟資料庫和記憶體資料庫。Redis 將資料儲存在記憶體裡面,讀寫資料的時候都不會受到硬碟 I/O 速度的限制,所以速度極快。
關鍵點,基於Key-Value,C語言編寫,不受I/O 速度的限制
為什麼Redis是單執行緒的:
因為Redis是基於記憶體的操作,CPU不是Redis的瓶頸,Redis的瓶頸最有可能是機器記憶體的大小或者網路頻寬。既然單執行緒容易實現,而且CPU不會成為瓶頸,那就順理成章地採用單執行緒的方案了(畢竟採用多執行緒會有很多麻煩!)
關鍵點

,CPU不是Redis的瓶頸
參考:https://blog.csdn.net/chenyao1994/article/details/79491337

2、java中volatile和synchronized有什麼區別
1)volatile是變數修飾符,而synchronized則作用於一段程式碼或方法
2)volatile只是在執行緒記憶體和“主”記憶體間同步某個變數的值;而synchronized通過鎖定和解鎖某個監視器同步所有變數的值。顯然synchronized要比volatile消耗更多資源。

volatile所修飾的變數不保留拷貝,直接訪問主記憶體中的。也就是保證多個執行緒訪問同一個記憶體。
在Java記憶體模型中,有main memory,每個執行緒也有自己的memory (例如暫存器)。為了效能,一個執行緒會在自己的memory中儲存要訪問的變數的副本。這樣就會出現同一個變數在某個瞬間,在一個執行緒的memory中的值可能與另外一個執行緒memory中的值,或者main memory中的值不一致的情況。 一個變數宣告為volatile,就意味著這個變數是不能儲存副本的,子執行緒的memory中不保留該變數的副本,如需訪問,需要每次到 main memory中獲取。這樣就能保證讀到的不是髒資料。

synchronized用來修飾一個方法或者一個程式碼塊的時候,能夠保證在同一時刻最多隻有一個執行緒執行該段程式碼。也就是,如果有多個執行緒來訪問這個方法或者程式碼塊的時候,第一個進入前就會把程式碼塊加鎖,其他執行緒被堵塞等待鎖被釋放。這樣就能達到方法塊被同步執行。