Java常见的一些经典面试题(附答案解析)( 五 )


二、forward()与redirect()的区别?forward是容器中控制权的转向 , 在客户端浏览器不会显示转向后的地址;redirect则是完全的跳转 , 浏览器将会得到跳转的地址 , 并重新发送请求链接 , 这样浏览器地址栏中就可以看到跳转后的链接地址 。 所以forward更加高效 , 在forward能满足需要时 , 尽量使用forward并且有助于隐藏实际的链接 。 如需要跳转到一个其他服务器上的资源 , 则必须使用redirect;
线程部分1. 程序 , 进程 , 线程这三者之间的关系?
一个程序中可以调用多个进程 , 一个进程中可以有多个线程;比如一个视频播放器 , 里面就有两个进程:一个是播放视频的进程 , 一个是下载上传视频的进程;多个用户看视频就是多个线程访问一个进程;
2.单线程与多线程区别 , 以及多线程意义?
如果程序只有一条执行路径 , 这就是单线程;相反如果有多条路径 , 那就是多线程;多线程的意义他可以让程序在一个时间执行多个事情 , 提高了应用程序的使用率;
3.理解并发与并行
并发:通过CPU调度算法 , 让用户看上去同时执行 , 实际上 , 是通过CPU再高速切换 , 并不是真正的同时 , 这就是并发;并行:多个CPU实例或者多台机器同时执行一段逻辑 , 这就是真正的同时 , 这就是并行;
4.如何创建线程方法一:(1)类去继承Thread类;(2)该类重写Thread类的run方法 , 并且将线程要执行的代码 , 存放到run方法中;(3)线程对象调用start()方法 , 开启线程 , 线程会自动执行run方法方法二(1)类继承Runnable接口(2)重写接口run方法 , 并将线程执行代码存放在run方法中(3)创建Thread对象 , 也就是创建线程(4)Thread线程对象调用start方法 , 启动线程
5.线程的几种状态?初始化(new Thread()) --> 就绪(start()准备执行) --> 执行(获得CPU执行权)执行1 --> 等待(wait()):线程处于等待状态 , 自己醒不了 , 只能用notify()或notifyAll()唤醒 , 处于等待状态的线程会释放CPU执行权 , 同时释放资源;执行2 --> 睡眠(sleep()):在指定毫秒数内让当前正常执行的线程休眠 , 只是暂停执行 , 他会释放CPU执行权 , 但不会释放资源 , 设定时间到了 , 就会脱离睡眠状态 , 进入执行状态;执行3 --> 阻塞:当多条线程存在输入输出时 , 就会出现阻塞状态执行4 --> 死亡:run方法执行完毕 , 线程结束了也就是处于死亡状态
6.多线程解决方法(1)同步代码块:代码块放入同步锁中(2)同步方法:方法前加synchronized关键字
7.什么是死锁(deadlock)?两个进程都在等待对象执行完后才继续往下执行的时候就发生了死锁 , 两个进程都陷入了无限的等待中;
数据库一、你所了解的数据库优化方面有哪些?1.Select语句必须指定字段名称2.当只查询结果为一条数据时 , 使用limit 13.避免where子句对字段进行null值判断(对于null的判断会导致引擎放弃使用索引而进行全表扫描)4.不建议使用%前缀模糊查询 , 防止全表扫描
二、事务的四大特征1.原子性(Atomicity)原子性是指事务包含的所有操作要么全部成功 , 要么全部失败回滚;2.一致性(Consistency)也就是说一个事物执行之前和执行之后都必须处于一致性状态;那转账来说 , 假设A和B两者的 钱一共是5000 , 不管A和B之间如何转账 , 转几次账 , 事务结束后两人的钱加起来还是5000 , 这就 是事务的一致性;3.隔离性隔离性当多个用户并发访问数据库并操作同一张表时 , 数据库为每一个用户开启的事务 , 不能被 其他事务操作所干扰 , 多个并发事务之间要相互隔离;比如两个并发事务T1和T2 , 在事务T1看来 ,T2要么在T1开始前结束事务 , 要么在T1结束后开始事务 , 这就是事务的隔离性;4.持久性执行性是指一个事务一旦被提交了 , 那么对数据库中的数据的改变就是永久性的;


推荐阅读