牛客网-Java专项练习10
答案设置为白色,框选即可显示
1.假设如下代码中,若t1线程在t2线程启动之前已经完成启动。代码的输出是()
public static void main(String[]args)throws Exception {
final Object obj = new Object();
Thread t1 = new Thread() {
public void run() {
synchronized (obj) {
try {
obj.wait();
System.out.println("Thread 1 wake up.");
} catch (InterruptedException e) {
}
}
}
};
t1.start();
Thread.sleep(1000);//We assume thread 1 must start up within 1 sec.
Thread t2 = new Thread() {
public void run() {
synchronized (obj) {
obj.notifyAll();
System.out.println("Thread 2 sent notify.");
}
}
};
t2.start();
}
A.
Thread 1 wake up
Thread 2 sent notify.
B.
Thread 2 sent notify.
Thread 1 wake up
C.A、B皆有可能
D.程序无输出卡死
答案:B
解析:执行obj.wait();时已释放了锁,所以t2可以再次获得锁,然后发消息通知t1执行,但这时t2还没有释放锁,所以肯定是执行t2,然后释放锁,之后t1才有机会执行。但有一点需要注意的是notify()调用后,并不是马上就释放对象锁的,而是在相应的synchronized(){}语句块执行结束,自动释放锁后,JVM会在wait()对象锁的线程中选取一线程,赋予其对象锁,唤醒线程,继续执行。
2.Java1.8版本之前的前提,Java特性中,abstract class和interface有什么区别()
A.抽象类可以有构造方法,接口中不能有构造方法
B.抽象类中可以有普通成员变量,接口中没有普通成员变量
C.抽象类中不可以包含静态方法,接口中可以包含静态方法
D.一个类可以实现多个接口,但只能继承一个抽象类。
答案:ABD
解析:
3.以下代码段执行后的输出结果为
public class Test {
public static void main(String args[]) {
int x = -5;
int y = -12;
System.out.println(y % x);
}
}
A.-1
B.2
C.1
D.-2
答案:D
解析:取余运算,符号最终于y/x的被除数y相同。
4.假如某个JAVA进程的JVM参数配置如下:
-Xms1G -Xmx2G -Xmn500M -XX:MaxPermSize=64M -XX:+UseConcMarkSweepGC -XX:SurvivorRatio=3,
请问eden区最终分配的大小是多少?
A.64M
B.500M
C.300M
D.100M
答案:C
解析:
Xms 起始内存
Xmx 最大内存
Xmn 新生代内存
XX:SurvivorRatio=3 说明Eden区与Survivor区的大小比值为3:2
Eden区的大小:
500M*(3/(3+2))
=500M*(3/5)
=500M*0.6
=300M
5.以下关于对象序列化描述正确的是
A.使用FileOutputStream可以将对象进行传输
B.使用PrintWriter可以将对象进行传输
C.使用transient修饰的变量不会被序列化
D.对象序列化的所属类需要实现Serializable接口
答案:CD
解析: 使用ObjectOutputStream和ObjectInputStream可以将对象进行传输。 声明为static和transient类型的成员数据不能被串行化。因为static代表类的状态, transient代表对象的临时数据。
6.下面有关servlet service描述错误的是?
A.不管是post还是get方法提交过来的连接,都会在service中处理
B.doGet/doPost 则是在 javax.servlet.GenericServlet 中实现的
C.service()是在javax.servlet.Servlet接口中定义的
D.service判断请求类型,决定是调用doGet还是doPost方法
答案:B
解析:doGet/doPost 则是在 javax.servlet.http.HttpServlet 中实现的