5.22面试题

1.BLOCKED和WAITING有什么区别

答:都是属于线程的阻塞等待状态。BLOCKED是指线程在等待监视器锁的时候的一个阻塞状态,也就是说在多个线程去竞争Synchronized同步锁的时候,没有竞争到锁资源的线程会被阻塞等待,而这个时候这个线程状态叫BLOCKED,在线程整个生命周期里面,只有Synchronized同步锁等待才会存在这个状态;而WAITING表示线程的等待状态,在这种状态里面,线程需要等待某一个线程的特定操作才会被唤醒,我们可以使用Object.wait(),Object.join(),LockSupport.park()使得线程去进入到一个WAITING状态,那么在这个状态下,我们必须要等待特定的方法来唤醒,比如Object.notify()可以去唤醒Object.wait()阻塞的线程,LockSupport.unpark()可以去唤醒可以去唤醒Object.wait()阻塞的线程阻塞的线程,所以我认为两者最大的区别如下:

BLOCKED是锁竞争失败后被动触发的状态,WAITING是人为主动触发的状态

BLOCKED的唤醒时自动触发的,而WAITING状态必须要通过特定的方法来主动唤醒

2.Integer

Integer封装类除了基本的int类型的一些操作以外,还引入了享元模式的设计,对-128~127之间的数据做了一层缓存,也就是说如果Integer类型的目标值在-128~127之间就直接从缓存里面去获取Integer这样的一个对象的实例,并且返回,否则会创建一个新的Integer对象,这样设计好处:减少频繁创建Integer对象带来的一个内存消耗从而去提升性能。如果这2个Integer取值范围[-128,127],并且用==来判断返回true,因为这2个Integer指向的内存地址是同一个

3.Thread和Runnable区别

  • Thread是一个类只能单一继承,而Runnable是接口支持多继承,所以如果在已经存在继承关系的类里面要去实现线程的话,只能实现Runnable接口
  • Runnable表示一个线程的顶级接口,而Thread类其实是实现了Runnable这样的一个接口,我们在使用Thread类或者实现Runnable接口时候,都需要去实现run()方法
  • 面向对象思想来讲,Runnable是一个任务,而Thread才是真正处理的线程,所以我们只需要用Runnable去定义一个具体的任务,然后交给Thread类处理就好,达到松耦合的一个目的

4.Cookie和Session区别

Cookie是客户端浏览器用来保存服务端数据的一种机制,当我们通过浏览器去进行网页访问的时候,服务器可以把某一些状态数据以key-value形式写入到cookie里面存储到客户端浏览器。然后客户端下一次访问服务器的时候,我们可以携带这一些状态数据发送到服务器端,服务器可以根据cookie里面携带的内容去识别使用者,而Session表示一个会话,它是属于服务器端的一个容器对象,默认情况下,它会针对每一个浏览器的请求,Servlet容器都会分配一个Session对象,session本质上可以认为是一个ConcurrentHashMap,它可以用来存储当前会话产生的一些状态数据,http协议本身是一个无状态协议,也就是说服务器端并不知道客户端发送过来的多次请求是属于同一个用户,所以session是用来弥补http状态的一个不足,简单来说,服务器端可以利用session来存储客户端在同一个会话里面产生的多次请求了一个记录,那么基于服务器端的session存储机制在结合客户端的cookie机制,我们就可以去实现有状态的http协议(原理:首先客户端第一次访问服务器端上的时候,服务器会针对这次请求创建一个会话,并且生成一个唯一的sessionid来标注这个会话,然后服务器端把这个sessionId写入到客户端浏览器的cookie里面,用来去实现客户端状态的一个保存,那么在后续的请求呢,每一次都会携带sessionId,服务器端就可以根据sessionId来识别当前这个会话的状态) 

5.项目亮点及bug

留言板功能:采用Ajax技术实现留言板功能,不需要刷新页面即可提交或删除留言。

解决表单重复提交问题:在提交留言板时,用户可能会多次点击提交按钮,导致表单重复提交。为了避免这种情况,我们引入了防止表单重复提交的机制,通过设置token将提交的表单数据与服务器端进行比较,确保每个表单只能被提交一次。

你可能感兴趣的:(java,开发语言)