java中级面试题1

java中级面试题11、threadlocal问题https://blog.csdn.net/tiwerbao/article/details/50827305ThreadLocal源码可以看出:1)      ThreadLocal赋初始值的时候,需要在线程运行中,即run()中,不能作为thread的属性,否则ThreadLocalMap会挂错线程;2)      使用ThreadLocal隔离的值不能是引用,否…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

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


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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/182996.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号