【阿里巴巴】一面面试题汇总

  • 操作系统进程间通信
  1. 管道通信:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。具有进程的亲缘关系通常是具有父子进程间的关系。
  2. 命名管道FIFO:命名管道也是一种半双工的通信方式,但他允许无亲缘关系进程间的通信。
  3. 消息队列MessageQueue:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递量少、管道只能承载无格式字符流以及缓冲区大小受限等缺点。
  4. 共享存储ShareMemeory:共享存储就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的IPC方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
  5. 信号量Semaphore:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常做为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
  6. 套接字(Socket):套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
  7. 信号(sinal):信号是一种比较复杂的通信方式,用于通知接收进程某个时间已经发生。
  • java保证线程间同步的方法

1.synchronized关键字,修饰方法,保证此方法只会有一个对象访问。修饰代码块。被该关键字修饰的语句块会自动被加上内置锁,从而实现同步。
2.wait()与notify
wait():使一个对象处于等待状态,并且释放所持有对象的lock。
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
ALLnotify():唤醒所有初入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们去竞争。
3.使用特殊域变量(volatile)实现线程同步
1.volatile关键字为域变量的访问提供了一种免锁机制
2.使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新。
3.因此每次使用该域就要重新计算,而不是使用寄存器中的值。
4.volatile不会提供任何原子操作,他也不能用来修饰final类型的变量。
5.使用方法:在互斥变量前加上volatile关键字修饰即可。

  • mysql的聚簇索引与非聚簇索引

聚簇是根据码值找到数据的物理存储位置,从而达到快速检索数据的目的。聚簇索引的顺序就是数据的物理存储顺序,叶节点就是数据节点。非聚簇索引的顺序与物理排列顺序无关,叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。。一个表最多只能有一个聚簇索引。
但是建立聚簇索引的空间耗费比较大对以后的增加删除的影响比较大,所以在有必要的情况下用。

  • java中List和Set的区别

list与set方法的区别:list可以允许重复对象和插入多个null值,而set不允许;list容器是有序的,而set容器是无序的等待。

  • 事务的并发问题

1.脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据。
2.不可重复读:事务 A多次读取同一数据,事务B在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。
3.幻读:系统管理员A将数据库中的所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻读一样,这就叫幻读。
小结:不可重复读和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。

-数据库四种事务的隔离级别

数据库事务的隔离级别有4种,由低到高分别是:Read uncommitted、Read committed、Repeatablead、Serializable
1.Read uncommitted(读未提交)
一个事务可能读取了另一个未提交事务的数据。
eg:
老板要给程序员发工资,程序员的工资是3.6万/月。但是发工资时老板不小心按错了数字,按成3.9万/月,该钱已经打到程序员的户口,但是事务还没有提交,就在这时,程序员去查看自己这个月的工资,发现比往常多了3千元,以为涨工资了非常高兴。但是老板及时发现了不对,马上回滚差点就提交了的事务,将数字改成3.6万再提交。
分析:
实际程序员这个月工资还是3.6万,但是程序员看到的是3.9万,他看到的是老板没提交事物的数据。就是脏读。
解决方法:Read commited读提交,能解决脏读问题。

2.Read commited(读已提交)
eg:
程序员拿着信用卡去享受生活(卡里当然是只有3.6万),当他埋单时(程序员事务开启),收费系统事先检测到他的卡里有3.6万,就在这个时候!!程序员的妻子要把钱全部转出充当家用,并提交。当收费系统准备扣款时,再检测卡里的金额,发现已经没钱了(第二次检测金额当然要等待妻子转出金额事务提交完)。程序员就会很郁闷,明明卡里是有钱的…
分析:
这就是读提交,若有事务对数据进行更新(UPDATE)操作时,读操作事物要等这个更新操作事物提交才能读取数据,可以解决脏读问题。但在这个示例中,出现了一个事物范围内两个相同的查询却返回了不同数据,这就是不可重复读。
解决方法:Repeatable read

3.Repeatable read
重复读,就是在开始读取数据(事务开启)时,不再允许修改操作。MySQL是这一级别。
eg:
程序员拿着信用卡去享受生活(卡里当然是只有3.6万),当他埋单时(事务开启,不允许其他事务的UPDATE修改操作),收费系统事先检测到他的卡里有3.6万。这个时候他的妻子不能转出金额了。接下来收费系统就可以扣款了。
分析:
重复读可以解决不可重复读问题。写到这里,应该明白一点就是,不可重复读对应的是修改 UPDATE操作。但是可能会有幻读问题。因为幻读问题对应的是插入INSERT操作,而不是UPDATE操作。
什么时候出现幻读?
eg:
程序员某一天消费,花了2千元,然后他的妻子去查看他今天的消费记录(全表扫描FTS,妻子事物开启),看到确实是花了2千元,就在这个时候,程序员花了1万元买了一台电脑,即新增INSERT了一条消费记录,并提交。当妻子打印程序员的消费记录清单时(妻子提交事务),发现花了1.2万元,似乎出现了幻读,就是幻读。
解决:Serializable
1.Serializable序列化
Serializable是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读,不可重复读与幻读。但是在这种事务隔离级别效率低下,比较消耗数据库性能,一般不用。
大多数数据库默认的事务隔离级别是Read committed 、比如 Sql Server ,Oracle.Mysql的默认级别是Repeatable read

  • 接口和抽象类有什么区别,你选择使用接口和抽象类的依据是什么?

接口和抽象类的概念不一样,接口是对动作的抽象,抽象类是对根源的抽象。
抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。比如,男人,女人,这两个类,他们的抽象类是人。说明,他们都是人。
人可以吃东西,狗也可以吃东西,你可以把“吃东西”定义成一个接口,然后让这些类去实现它。
所以,在高级语言上,一个类只能继承一个类(抽象类)(正如人不可能同时是生物和非生物),但是却可以实现多个接口(吃饭接口、动作接口)。
总结:

  1. 抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
  2. 抽象类要被子类继承,接口要被类实现。
  3. 接口只能做方法声明,抽象类中既可以做方法声明,也可以做方法实现。
  4. 接口里定义的变量只能是公共的静态的变量,抽象类中的变量只能是普通的变量。
  5. 抽象类中的所有方法必须全部被子类所实现,如果子类不能全部是心啊父类的抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
  6. 抽象方法只能声明,不能实现,接口是设计的结果,抽象类是重构的结果。
  7. 抽象类里可以没有抽象方法。
  8. 如果一个类里有抽象方法,那么这个类只能是抽象类。
  9. 抽象方法要被实现,所以不能是静态的,也不能是私有的。
  10. 接口可继承接口,并可多继承接口,但类只能单根继承。
  • 什么是死锁?死锁的四个必要条件

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程成为死锁进程。
四个必要条件:
1.互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其他进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。
2. 请求与保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已经被其他资源占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
3. 不可剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能由获得该资源的进程自己来释放(只能是主动释放)
4. 循环等待条件:指在发生死锁时,必然存在一个进程——资源的环形练,即进程集合{P0,P1,P2,。。。Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,。。。Pn正在等待已被P0占用的资源。
这四个条件时死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

猜你喜欢

转载自blog.csdn.net/qq_44867340/article/details/106400347