天天看點

【面試相關】synchronized、程式設計判斷大小端、聚集索引和非聚集索引、IO多路複用

1、JVM中鎖的關鍵字

1.1 synchronized

  • ① 作用範圍:

代碼塊

方法(修飾普通方法鎖的對象預設是目前對象this,修飾靜态方法預設鎖的是目前類)

類(修飾類時,所有線程需要的鎖是同一把)

  • ② 是如何保證線程安全的?

加鎖和釋放鎖的原理

可重入原理:加鎖次數計數器

可見性原理:記憶體模型+happens-before

  • ③ 重量級鎖,如何優化?

鎖的更新:無鎖—>偏向鎖—>自旋鎖—>重量級鎖

鎖的優化技術:鎖粗化、鎖消除、輕量級鎖、偏向鎖、适應性自旋

  • ④ synchronized的缺陷,Lock是怎麼彌補的?

缺陷:

1、效率低:

- 隻有代碼執行完畢或者異常結束才會釋放鎖; (鎖的釋放)

- 并且試圖擷取鎖的時候不能設定逾時; (逾時設定)tryLock

- 不能中斷一個正在使用鎖的線程 (線程中斷) ReentrantLock的lockInterruptibly()方法可以優先考慮響應中斷

2、不夠靈活:

- 加鎖和釋放鎖的時機單一,每個鎖隻有單一的條件,讀寫鎖更加靈活。

3、無法知道是否成功獲得鎖

- Lock可以拿到狀态 Condition與Lock的結合

2、如何程式設計判斷大小端?

小端:高位放高位元組,低位放低位元組

大端:高位放低位元組,低位放高位元組

#include <stdio.h>
 
union node
{
    int num;
    char ch;
};
 
void big_small(union node p)
{
    p.num = 0x12345678;
    if(p.ch == 0x78)
    {
        printf("It is small-endian.\n");
    }
    else
    {
        printf("It is big-endian.\n");
    }
}
int main()
{
    union node p;
    big_small(p);
    return 0;
}
           

3、程序和線程

同一程序的線程:

  • 共享:該程序的全部系統資源,如虛拟位址空間、檔案描述符、信号處理
  • 獨享:棧、寄存器環境、線程本地存儲

4、MyISAM和InnoDB的差別

  • M不支援事務,Inno可以
  • M支援全文索引,Inno不可以
  • M支援表級鎖,Inno支援行級鎖
  • M效率更優,Inno更安全

    綜合以上,M适管理非事務表,高速存儲、檢索、全文搜尋;Inno用于事務處理應用程式(ACID事務支援),多使用者并發操作。

5、聚集索引和非聚集索引的差別

參考拼音查詢和偏旁查詢

聚集索引:正文内容本身就是一種按照一定規則排列的目錄(實體上連續),查詢資料速度快,插入速度慢;(一個表隻有一個)

非聚集索引:邏輯上連續,實體上不連續,查詢資料速度慢,插入速度快。

6、IO多路複用

https://www.cnblogs.com/yanguhung/p/10145755.html

繼續閱讀