百度移动端面试回忆

百度一面:

1. 自我介绍

2. 悲观锁和乐观锁

乐观锁:

 总是认为不会产生并发问题,每次去取数据的时候总认为不会有其他线程对数据进行修改,因此不会上锁,但是在更新时会判断其他线程在这之前有没有对数据进行修改,一般会使用版本号机制或CAS操作实现。

  •  version方式(版本号机制):一般是在数据表中加上一个数据版本号version字段,表示数据被修改的次数,当数据被修改时,version值会加一。当线程A要更新数据值时,在读取数据的同时也会读取version值,在提交更新时,若刚才读取到的version值为当前数据库中的version值相等时才更新,否则重试更新操作,直到更新成功。
  • CAS操作方式:即compare and swap 或者 compare and set,涉及到三个操作数,数据所在的内存值,预期值,新值。当需要更新时,判断当前内存值与之前取到的值是否相等,若相等,则用新值更新,若失败则重试,一般情况下是一个自旋操作,即不断的重试。

悲观锁:

 总是假设最坏的情况,每次取数据时都认为其他线程会修改,所以都会加锁(读锁、写锁、行锁等),当其他线程想要访问数据时,都需要阻塞挂起。可以依靠数据库实现,如行锁、读锁和写锁等,都是在操作之前加锁,在Java中,synchronized的思想也是悲观锁

3. Android跨线程通信, Handler

Android进阶——Android消息机制之Looper、Handler、MessageQueen

Android消息机制图解

4. Android跨进程通信,Binder

Android跨进程通信:图文详解 Binder机制 原理

5. Android的性能优化

6. 动态链接和静态链接的区别

  • 静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序运行的时候不再需要其它的库文件。
  • 动态链接就是把调用的函数所在文件模块(DLL)和调用函数在文件中的位置等信息链接进目标程序,程序运行的时候再从DLL中寻找相应函数代码,因此需要相应DLL文件的支持。 动态链接的主要目的:把程序与他们使用的特定的函数库版本中分离开来。

静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了。但是若使用 DLL,该 DLL 不必被包含在最终 EXE 文件中,EXE 文件执行时可以“动态”地引用和卸载这个与 EXE 独立的 DLL 文件。 静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。

动态链接的优点:

  1. 可执行文件的体积可以非常小,节省磁盘空间和虚拟内存,能更加有效的利用磁盘空间。
  2. 链接-编辑阶段的时间会缩短(因为链接器的有些工作被推迟到载入)
  3. 所有动态链接到某个特定函数库的可执行文件在运行时共享该函数库在内存中的一个单独拷贝。这就提供了更好的I/O和交换空间利用率,节省了物理内存,提高了系统整体性能。

不足之处:

  • 使用静态链接生成的可执行文件体积较大,包含相同的公共代码,造成浪费;     
  •  使用动态链接库的应用程序不是自完备的,它依赖的DLL模块也要存在,如果使用载入时动态链接,程序启动时发现DLL不存在,系统将终止程序并给出错误信息。而使用运行时动态链接,系统不会终止,但由于DLL中的导出函数不可用,程序会加载失败;速度比静态链接慢。当某个模块更新后,如果新模块与旧的模块不兼容,那么那些需要该模块才能运行的软件,统统撕掉。这在早期Windows中很常见。

8. TCP三次握手,四次挥手

TCP建立连接和释放连接过程

9. 如何实现线程同步

  • 同步方法。使用synchronized关键字修饰的方法。由于java的每个对象都有一个内置锁,当用关键字修饰此方法时,内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则该线程就处于阻塞状态。 代码如:public synchronized
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值