# Java高级面试题合集,附答案解析
1、说明Tomcat配置了多少个Valve?
2、Java中Semaphore是什么?
3、一个类的构造方法的作用是什么?若一个类没有声明构造方法,改程序能正确执行吗?为什么?
4、请说出与线程同步以及线程调度相关的方法。
5、正则表达式有那些符号?
6、介绍一下 JVM 中垃圾收集器有哪些? 他们特点分别是什么?
7、Log4j日志有几个级别?
8、有哪些类加载器?
9、描述一下 JVM 加载 class 文件的原理机制。
10、Jsp指令有那些?
### [1、说明Tomcat配置了多少个Valve?]( #1说明tomcat配置了多少个valve)
Tomcat配置了四种类型的Valve:
**1、** 访问日志
**2、** 远程地址过滤
**3、** 远程主机过滤器
**4、** 客户请求记录器
### [2、Java中Semaphore是什么?]( #2java中semaphore是什么)
Java中的Semaphore是一种新的同步类,它是一个计数信号。从概念上讲,从概念上讲,信号量维护了一个许可集合。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release()添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore只对可用许可的号码进行计数,并采取相应的行动。信号量常常用于多线程的代码中,比如数据库连接池。
### [3、一个类的构造方法的作用是什么?若一个类没有声明构造方法,改程序能正确执行吗?为什么?]( #3一个类的构造方法的作用是什么若一个类没有声明构造方法改程序能正确执行吗为什么)
主要作用是完成对类对象的初始化工作。可以执行。因为一个类即使没有声明构造方法也会有默认的不带参数的构造方法。
### [4、请说出与线程同步以及线程调度相关的方法。]( #4请说出与线程同步以及线程调度相关的方法。)
**1、** wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁;
**2、** sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要处理InterruptedException异常;
**3、** notify():唤醒一个处于等待状态的线程,当然在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且与优先级无关;
**4、** notityAll():唤醒所有处于等待状态的线程,该方法并不是将对象的锁给所有线程,而是让它们竞争,只有获得锁的线程才能进入就绪状态;
> 提示:关于Java多线程和并发编程的问题,建议大家看我的另一篇文章[《关于Java并发编程的总结和思考》](http://blog.csdn.net/jackfrued/article/details/44499227)。
> 补充:Java 5通过Lock接口提供了显式的锁机制(explicit lock),增强了灵活性以及对线程的协调。Lock接口中定义了加锁(lock())和解锁(unlock())的方法,同时还提供了newCondition()方法来产生用于线程之间通信的Condition对象;此外,Java 5还提供了信号量机制(semaphore),信号量可以用来限制对某个共享资源进行访问的线程的数量。在对资源进行访问之前,线程必须得到信号量的许可(调用Semaphore对象的acquire()方法);在完成对资源的访问后,线程必须向信号量归还许可(调用Semaphore对象的release()方法)。
下面的例子演示了100个线程同时向一个银行账户中存入1元钱,在没有使用同步机制和使用同步机制情况下的执行情况。
**银行账户类:**
```
/
* 银行账户
* @author 骆昊
*
*/
public class Account {