Java面试题

本文深入探讨Java并发中的sleep与wait方法的区别,以及索引的存储结构、线程池满时的任务拒绝策略。同时解析Oracle的锁机制,包括读未提交、读已提交、可重复读和序列化的隔离级别,以及JavaScript中方法覆盖机制。进一步解释单例模式的实例化方式、NIO与IO的区别、双向关联维护和逆向引用的概念,最后概述ReentrantLock与synchronized的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. Sleep和wait的区别:
(1)sleep来自 thread类,wait来自 object类
(2)sleep不释放锁,还有线程控制权。wait释放锁,交出线程控制权,需要notify
(3)sleep必须捕捉异常,wait不必

2. 索引的存储结构是什么:
索引是通过平衡二叉树来存储的。这样可以实现高效的存储,查询。二叉树的每个叶子结点都用来存储键值和rowid.有点是对于每个节点平衡二叉树的查询速度都是log(n)
索引的属性
有两种类型的索引块:

* 用于搜索的分支块
* 用于存储索引数据的叶块

(1) 分支块
分支块中存储以下信息:

* 最小的键值前缀,用于在本块的两个键值之间做出分支选择
* 指向包含所查找键值的子块的指针

包含 n 个键值的分支块含有 n+1 个指针。键值及指针的数量同时还受索引块容量的限制。
(2) 叶块
所有叶块相对于其根分支块的深度是相同的。叶块用于存储以下信息:

* 数据行的键值
* 键值对应数据行的 ROWID

所有的键值-ROWID 对都与其左右的兄弟节点向链接,并按照(key,ROWID)的顺序排序。

3.当线程池满的时候可以设置任务拒绝策略:有四种任务拒绝策略,分别为直接丢弃策略,丢弃最老策略,抛出异常策略,调用者执行策略。如果设置为调用者执行策略,当前线程将会去执行run方法。如下为代码,可以调用方法setRejectedExecutionHandler()来设置。

ThreadPoolExecutor pool = new ThreadPoolExecutor(1, 1, 0, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(1));
pool.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
for (int i = 0; i < 10; i++)
{
final int index = i;
pool.submit(new Runnable()
{
public void run()
{
log("run task:" + index + " -> " + Thread.currentThread().getName());
try
{
Thread.sleep(1000L);
}
catch (Exception e)
{
e.printStackTrace();
}
log("run over:" + index + " -> " + Thread.currentThread().getName());
}
});
}



3. 隔离级别(isolation level) http://epub.itpub.net/3/4.htm

4. Oracle的锁机制
http://blog.youkuaiyun.com/vogts/article/details/1618406
http://www.cnblogs.com/jianging/archive/2011/03/29/1999311.html
Oracle分为独占锁,共享锁,更新锁。
共享锁指的是其它事务可以读,但不能修改它
更新锁指的是当当前事务没有修改数据的时候,其它事物可以读取数据。但是当当前事务要跟新事物的时候,就会把锁变成独占锁

锁的级别可以锁在行上也可以锁在表上。
因此对于上面的隔离性就可以加不同的锁来实现了
读未提交:写的时候对行加共享锁
读已提交:写的时候对行加独占锁
可重复读:写的时候对行加排它锁,读的时候对行级别加共享锁
序列化:读写的时候都对表加排它锁

5.javascript 中两个方法名相同的方法。当jsp调用的时候,会有什么效果。
当方法名相同时,javascript会用后定义的方法覆盖前面定义的方法。当两个方法在不同的
include文件中的时候,也按照include的顺序,后面的覆盖前面的。

6. inverse=true的含义: 由双向关联另一方维护该关联,己方不维护该关联(只能进行查询操作),作用:当many to many的时候,一方设为inverse = true,避免重复更新。
http://blog.youkuaiyun.com/leader_lx/article/details/2774137

7.单例模式最好用什么方法来实例化
用内部类来做延迟加载 http://blog.sina.com.cn/s/blog_75247c770100yxpb.html

8.Nio 和io的区别 http://blog.youkuaiyun.com/kobejayandy/article/details/11545057
http://canann.iteye.com/blog/1853569
面向流与面向缓冲
Java NIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。 Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区。 Java NIO的缓冲导向方法略有不同。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。但是,还需要检查是否该缓冲区中包含所有您需要处理的数据。而且,需确保当更多的数据读入缓冲区时,不要覆盖缓冲区里尚未处理的数据。

阻塞与非阻塞IO
Java IO的各种流是阻塞的。这意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了。 Java NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取。而不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。 非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。 线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,所以一个单独的线程现在可以管理多个输入和输出通道(channel)。

9.ReentrantLock和synchronized
http://wsmajunfeng.iteye.com/blog/1492316
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值