题目皆摘自牛客网JAVA专项练习
1.
2.
3.
servle是单例的 Struts2是多例的 记住这个就OK了
4.
假设两线程为A、B,设有3种情况:
1.AB不并发:此时相当于两个方法顺序执行。A执行完后a=-1,B使用-1作为a的初值,B执行完后a=-2
2.AB完全并发:此时读写冲突,相当于只有一个线程对a的读写最终生效。相同于方法只执行了一次。此时a=-1
3.AB部分并发:假设A先进行第一次读写,得到a=1;之后A的读写被B覆盖了。B使用用1作为a的初值,B执行完后a=0
5.
创建线程对象两种方式:
1.继承Thread类,重载run方法;
2.实现Runnable接口,实现run方法
6.
7.
三元操作符如果遇到可以转换为数字的类型,会做自动类型提升。
比如
1
2
Object o1 = (false
) ?
new
Double(
1.0
) :
new
Integer(
2);
System.out.println(o1);
会打印2.0
8.
A:静态方法是一个属于类而不属于对象(实例)的方法。(√)
B:静态方法只能访问静态数据。无法访问非静态数据(实例变量)。(√)
C:静态方法只能调用其他静态方法,不能从中调用非静态方法。(√)
D:静态方法不能通过类名直接访问,也不需要任何对象。(×) 静态方法可以直接用类名访问。
附加面试题:
问:
什么是死锁?怎么防止死锁?
答:
死锁:当线程 A 持有独占锁a,并尝试去获取独占锁 b 的同时,线程 B 持有独占锁 b,并尝试获取独占锁 a 的情况下,就会发生 AB 两个线程由于互相持有对方需要的锁,而发生的阻塞现象,我们称为死锁。
防止死锁的方法:
1)尽量使用 tryLock(long timeout, TimeUnit unit)的方法(ReentrantLock、ReentrantReadWriteLock),设置超时时间,超时可以退出防止死锁。
2)尽量使用 Java. util. concurrent 并发类代替自己手写锁。
3)尽量降低锁的使用粒度,尽量不要几个功能用同一把锁。
4)尽量减少同步的代码块。