java后端高频面试题笔记(更新中)

多线程相关

1.servlet线程安全问题

(1)为什么说servlet会有线程安全问题?

  1. 容器只会创建一个servlet实例。
  2. 容器收到请求之后,会启动一个线程来处理该请求,当有多个请求同时访问同一个servlet,就有可能产生线程安全问题(比如,这些线程同时去修改某个属性值)。

(2) 如何解决?
方式一:加锁
将有线程安全问题的代码使用synchronize加锁,但是加锁会影响其性能。
方式二:尽可能避免修改servlet的属性。

2.Synchronize 和 Lock区别

  1. Synchronize 内置的Java关键字,Lock是一个java类
  2. Synchronize 无法判断获取锁的状态,Lock可以判断是否获取到了锁
  3. Synchronize 会自动释放锁,Lock必须要手动释放锁!如果不释放锁,会造成死锁
  4. Synchronize 线程1获得锁或者阻塞,线程2都只能等待;而Lock锁不一定会等待下去
  5. Synchronize 可重入锁,不可以中断,非公平的;Lock锁,可重入锁,可以判断锁,非公平,但是可以自己设置成公平的;
  6. Synchronize 适合锁少量的代码同步问题,Lock适合锁大量的同步代码!

3.wait为什么是数Object类下面的方法?

关于wait()暂停的是持有锁的对象,所以想调用wait()必须为:对象.wait();

notify()唤醒的是等待锁的对象,调用:对象.notify();

如下:

Object obj = newObject();

synchronized(obj){

    try{  

      obj.wait();

      }catch(Exception e){}

      obj.notify();

  }
  1. 注意:wait(),notify(),notifyAll()都必须使用在同步中,因为要对持有监视器(锁)的线程操作。所以要使用在同步中,因为只有同步才具有锁。
  2. 为什么这些操作线程的方法要定义在object类中呢?
    简单说:因为synchronized中的这把锁可以是任意对象,所以任意对象都可以调用wait()和notify();所以wait和notify属于Object。
    专业说:因为这些方法在操作同步线程时,都必须要标识它们操作线程的锁,只有同一个锁上的被等待线程,可以被同一个锁上的notify唤醒,不可以对不同锁中的线程进行唤醒。也就是说,等待和唤醒必须是同一个锁。而锁可以是任意对象,所以可以被任意对象调用的方法是定义在object类中。

JVM相关

为什么使用元空间替换永久代?

  1. 避免OOM异常。因为通常使用PermSize和MaxPermSize设置永久代的大小就决定了永久代的上限,但是不是总能知道应该设置为多大合适, 如果使用默认值很容易遇到OOM错误。
  2. 当使用元空间时,可以加载多少类的元数据就不再由MaxPermSize控制, 而由系统的实际可用空间来控制。
  3. 更深层的原因还是要合并HotSpot和JRockit的代码,JRockit从来没有所谓的永久代,也不需要开发运维人员设置永久代的大小,但是运行良好。同时也不用担心运行性能问题了,在覆盖到的测试中,程序启动和运行速度降低不超过1%,但是这点性能损失换来了更大的安全保障。

分布式相关

1.CAP问题(其实就是CP或者AP)

CAP定理又称CAP原则,指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),最多只能同时三个特性中的两个,三者不可兼得。
Consistency (一致性):
即更新操作成功并返回客户端后,所有节点在同一时间的数据完全一致,这就是分布式的一致性。
Availability (可用性):
可用性即服务一直可用,而且是正常响应时间。好的可用性主要是指系统能够很好的为用户服务,不出现用户操作失败或者访问超时等用户体验不好的情况。
Partition Tolerance (分区容错性):
即分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性或可用性的服务。
总的来说就是,数据存在的节点越多,分区容忍性越高,但要复制更新的数据就越多,一致性就越难保证。为了保证一致性,更新所有节点数据所需要的时间就越长,可用性就会降低。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值