java中级面试题1

1、threadlocal问题

https://blog.csdn.net/tiwerbao/article/details/50827305

ThreadLocal源码可以看出:

1)      ThreadLocal赋初始值的时候,需要在线程运行中,即run()中,不能作为thread的属性,否则ThreadLocalMap会挂错线程

2)      使用ThreadLocal隔离的值不能是引用,否则隔离的只是引用,而引用所指向的对象则隔离失败;

3)      本地数据区ThreadLocalMap是挂在Thread对象上的,所以要注意线程复用(线程池)所带来的污染

2、

https://blog.csdn.net/h12kjgj/article/details/55063956springMVC中,一般Controller、service、DAO层的scope均是singleton;

每个请求都是单独的线程,即使同时访问同一个Controller对象,因为并没有修改Controller对象,相当于针对Controller对象而言,只是读操作,没有写操作,不需要做同步处理。

由于只有一个Controller的instance,当多个线程同时调用它的时候,它里面的instance变量就不是线程安全的了,会发生窜数据的问题。,因此,我们在使用spring mvc 的contrller时,应避免在controller中定义实例变量。

而tomcat可以选择但是不是每次收到请求就开一个新的线程,而是使用线程池,线程池的线程数量通常有限制的,如果所有线程都被阻塞(例如网速慢,或者被人恶意占用连接),那么接下来的请求将会排队等待。或者 使用nio 收到一个请求就新开一个线程去处理任务,主线程返回,继续处理下一个任务,这种为非阻塞.

Tomcat运行可以选择BIO或者NIO模型,原理分别对应上面的3和4两种方式。Tomcat默认是BIO方式运行,如果想要换成NIO,可以配置server.xml:

<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" .../>

从性能上考虑建议使用NIO。

Tomcat线程池每次从队列头部取线程去处理请求,请求完结束后再放到队列尾部,也就是说前后两次请求处理不会用同一个线程。某个线程闲置超过maxIdleTime就释放掉。

真正决定Tomcat最大可能达到的线程数是maxConnections这个参数和并发数,当并发数超过这个参数则请求会排队,这时响应的快慢就看你的程序性能了。

3、

.CountDownLatch用法

CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。

CountDownLatch类只提供了一个构造器:

1
public CountDownLatch( int count) {  };  //参数count为计数值

然后下面这3个方法是CountDownLatch类中最重要的方法:

1
2
3
public void await() throws InterruptedException { };   //调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行
public boolean await( long timeout, TimeUnit unit) throws InterruptedException { };  //和await()类似,只不过等待一定的时间后count值还没变为0的话就会继续执行
public void countDown() { };  //将count值减1

CyclicBarrier用法

字面意思回环栅栏,通过它可以实现让一组线程等待至某个状态之后再全部同时执行。叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用。我们暂且把这个状态就叫做barrier,当调用await()方法之后,线程就处于barrier了。

CyclicBarrier类位于java.util.concurrent包下,CyclicBarrier提供2个构造器:

1
2
3
4
5
public CyclicBarrier( int parties, Runnable barrierAction) {
}
 
public CyclicBarrier( int parties) {
}

参数parties指让多少个线程或者任务等待至barrier状态;参数barrierAction为当这些线程都达到barrier状态时会执行的内容。


CountDownLatch一般用于某个线程A等待若干个其他线程执行完任务之后,它才执行;

而CyclicBarrier一般用于一组线程互相等待至某个状态,然后这一组线程再同时执行;

另外,CountDownLatch是不能够重用的,而CyclicBarrier是可以重用的。

4\CopyOnWriteArrayList问到最大容量,一时懵逼,毕竟没人问过,看了下源码应该是int

5\线上服务器排查

https://blog.csdn.net/and1kaney/article/details/51214219


总结,需要认真对待每次面试,做好充分的准备才行




你可能感兴趣的:(面试)