天天看点

【面试相关】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

继续阅读