以下是顺丰笔试真题:
线程问题可以参照:java 并发面试题,这里已经总结的很好了
线程通过调用对象的 synchronized 方法可获得对象的互斥锁定
答:A、一个线程在访问一个对象的同步方法时,另一个线程可以同时访问这个对象的非同步方法
B、 一个线程在访问一个对象的同步方法时,另一个线程不能同时访问这个同步方法。
线程调度算法是平台独立的
正确的说法:
异常的继承结构:基类为 Throwable,其中 Error 和 Exception 继承 Throwable,而 RuntimeException 和 IOException 等继承 Exception。
非 RuntimeException 一般是外部错误,其需要被 try{}catch 语句块所捕获,或者用 throws 子句声明抛出
类体系描述了 Java 运行系统中的内部错误以及资源耗尽的情形,Error 通常不需要捕捉
ReadWriteLock 适用于读多写少的并发场景
解释:当读取的时候线程会获得 read 锁,其他线程也可以获得 read 锁同时并发的去读取,但是写程序运行获取到 write 锁的时候,其他线程是不能进行操作的,因为 write 是排它锁,
volatile 关键字用在多线程同步中,可保证读取的可见性。
JVM 保证从主内存加载到线程工作内存的值是最新的
volatile 能禁止进行指令重排序
Vector(矢量)、StringBuffer、Properties、HashTable 是线程安全的
HashMap、ArryList、stringbuilder 是非线程安全的。
Java 使用 finalize() 方法在垃圾收集器象从内存中清除出去之前做必要的清理工作
父类 B 静态代码块-> 子类 A 静态代码块-> 父类 B 非静态代码块-> 父类 B 构造函数-> 子类 A 非静态代码块-> 子类 A 构造函数
wait() 导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法
dst=new String(src,"GBK").getBytes("UTF-8")
对于 JVM 内存配置参数:
-Xmx10240m -Xms10240m -Xmn5120m -XXSurvivorRatio=3
最小内存值和 Survivor 区总大小分别是 10240m,2048m
-Xms10240m 初始堆大小即最小内存值
XXSurvivorRatio=3,即 Eden:FromSurvivor:ToSurvivor=3:1:1;所以 Survivor 一共是 2048
对于一个已经不被任何变量引用的对象,当垃圾回收器准备回收该对象所占用的内存时,将自动调用该对象 finalize
错误的说法:
Java 并发:CopyOnWriteArrayList 适用于写多读少的并发场景
解释:CopyOnWriteArrayList(免锁容器)的好处之一是当多个迭代器同时遍历和修改这个列表时,不会抛出 ConcurrentModificationException。在 CopyOnWriteArrayList 中,写入将导致创建整个底层数组的副本,而源数组将保留在原地,使得复制的数组在被修改时,读取操作可以安全地执行。
ConcurrentHashMap 的写操作不需要加锁,读操作需要加锁
解释:java5 中新增了 ConcurrentMap 接口和它的一个实现类 ConcurrentHashMap。ConcurrentHashMap 提供了和 Hashtable 以及 SynchronizedMap 中所不同的锁机制。比起 synchronizedMap 来,它提供了好得多的并发性。多个读操作几乎总可以并发地执行,同时进行的读和写操作通常也能并发地执行,而同时进行的写操作仍然可以不时地并发进行(相关的类也提供了类似的多个读线程的并发性,但是,只允许有一个活动的写线程)。
只要在定义 int 类型的成员变量 i 的时候加上 volatile 关键字,那么多线程并发执行 i++ 这样的操作的时候就是线程安全的了
解释:Volatile 变量具有 synchronized 的可见性特性,但是不具备原子特性。可以被看作是一种 “程度较轻的 synchronized”;与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是 synchronized 的一部分。
您只能在有限的一些情形下使用 volatile 变量替代锁。要使 volatile 变量提供理想的线程安全,必须同时满足下面两个条件:
A. 对变量的写操作不依赖于当前值。
B. 该变量没有包含在具有其他变量的不变式中。
volatile 能保证线程安全。(不对,原因参照上一条,限制性条件)
java 中的 wait( )方法和 sleep( )方法的区别描述正确:
wait()方法属于 Object 类,二 sleep()属于 Thread 类
调用 wait()方法的时候,线程会放弃对象锁
调用 sleep()方法的过程中,线程不会释放对象锁
答:sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用 sleep 不会释放对象锁。
wait 是 Object 类的方法,对此对象调用 wait 方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出 notify 方法(或 notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
doGet/doPost 则是在 javax.servlet.GenericServlet 中实现的
service()是在 javax.servlet.Servlet 接口中定义的, 在 javax.servlet.GenericServlet 中实现了这个接口, 而 doGet/doPost 则是在 javax.servlet.http.HttpServlet 中实现的, javax.servlet.http.HttpServlet 是 javax.servlet.GenericServlet 的子类. 所有可以这样理解, 其实所有的请求均首先由 service() 进行处理, 而在 javax.servlet.http.HttpServlet 的 service() 方法中, 主要做的事情就是判断请求类型是 Get 还是 Post, 然后调用对应的 doGet/doPost 执行.
下列 Java 代码中的变量 a、b、c 分别在内存的____存储区存放。
class A {
private String a = “aa”;
public boolean methodB() {
String b = “bb”;
final String c = “cc”;
}
}
答案:a 存在堆区,b 和 c 存在栈区
这也是 Java 比较占内存的原因,实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针!
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于