java多线程面试题

所需积分/C币:50 2017-11-08 23:09:17 678KB PDF
收藏 收藏 3
举报

java多线程面试经典,内含50道常被面试官问到的java多线程题。
●一个对象的终结操作必需在这个对象构造完成之后,也 叫对象终结规则。 可传递性 7)Java中的 volatile变量是什么? volatile是一个特殊的修饰符,只有成员变量才能使用它。在 Jaa并发程序缺少同步类的情况下,多线程对成员变量的操作对其 它线程是透明的。 volatile变量可以保证下一个读取操作会在前一个 写操作之后发生,就是上一题的 volatile变量规则。 8)什么是线程安全?Vecr是一个线程安全类吗? 如果你的代码所在的进程中有多个线程在同时运行,而这些线 程可能会同时运行这段代码。如果每次运行结果和单线程运行的结 果是一样的,而且其他的变量的值也和预期的是一祥的,就是线程 安全的。一个线程安全的计数器类的同一个实例对象在被多个线程 使用的情况下也不会出现计算失误。很显然你可以将集合类分成两 组,线程安全和非线程安全的。Ⅴ ector是用同步方法来实现线程安 全的,而和它相似的Ayst不是线程安全的。 9)Java中如何停止一个线程? Java提供了很丰富的API但没有为停止线程提供API。JDK1.0 本来有一些像stp0, suspend0和 resume(的控制方法但是由于潜在 的死锁威胁因此在后续的JDK版木中他们被弃用了,之后 JavaAPI 的设计者就没有提供一个兼容且线程安全的方法来停止一个线程。 当umn或者ca)方法执行完的时候线程会自动结束,如果要手动结 束一个线程,你可以用 volatile布尔变量来退出run0方法的循环或者 是取消任务来中断线程。 10)一个线程运行时发生异常会怎样? 如果异常没有被捕获该线程将会停止执行 Thread. Uncaught ExceptionHandler是用于处理未捎获异常造成线程 突然中断情况的一个内嵌接口。当一个未捕获异常将造成线程中 断的时候JVM会使用Th read. getUncau ght Exception handler来查询 线程的 UncaughtExceptionHandler并将线程和异常作为参数传递 给 handler的 uncaughtException0方法进行处理 11)如何在两个线程间共享数据? 可以通过共享对象来实现这个目的,或者是使用像阻塞队列 这样并发的数据结构。用wlit和 notify方法实现了生产者消费者 模型 12ava中noi和 notifyAll有什么区别? notify(方法不能唤醒菜个具体的线程,所以只有一个线程在等待的 时候它才有用武之地。而 notify唤醒所有线程并允许他们争夺锁 确保了至少有一个线程能继续运行。 13)为什么 wait,not和motA这些方法不在 thread类里面? JAVA提供的锁是对象级的而不是线程级的,每个对象都有 锁,通过线程获得。如釆线程需要等待某些锁那么调用对象中的 wait方法就有意义了。如果wait0方法定义在 Thread类中,线程 正在等待的是哪个锁就不明显了。简单的说,由于wai, notify和 notify都是锁级别的操作,所以把他们定义在 Object类中因为 锁属于对象。 14什么是 ThreadLocal变量? Threadlocal是Java里一种特殊的变量。每个线程都有一个 Threadlocal就是每个线程都拥有了自己独立的一个变量,竞争条件 被彻底消除了。它是为创建代价高昂的对象获取线程安全的好方 法,比如你可以用 Threadlocal让 SimpleDateFormat变成线程安全 的,因为那个类创建代价高昂且每次调用都需要创建不同的实例所 以不值得在局部范固使用它,如果为每个线程提供一个自己独有的 变量拷贝,将大大提高效率。首先,通过复用减少了代价高昂的对 象的创建个数。其次,你在没有使用高代价的同步或者不变性的情 况下获得了线程安全。线程局部变量的另一个不错的例子是 Threadlocalrandom类,它在多线程环境中减少了创建代价高昻的 Random对象的个数。 5)什么是 Futuretask? 在Jaa并发程序中 Futuretask表示一个可以取消的异步运算。 它有启动和取消运算、查询运算是否完成和取回运算结果等方法 只有当运算完成的时候结果才能取回,如采运算尚未完成et方法将 会阻塞。一个 utureTask对象可以对调用了 Callable和 Runnable的 对象进行包装,由于 Futuretask也是调用了 Runnable接口所以它可 以提交给 Executor来执行。 10为什么Wa和 notify方法要在同步块中调用? 主要是因为java∧PI强制要求这样做,如果你不这么做,你 的代码会抛出Ⅲ legalMonitor State Exception异常。还有一个原因是 为了避免wa和 notify之同产生竞态条件。 17为什么你应该在循环中检查等待条件? 处于等待状态的线程可能会收到错误警报和伪唤醒,如果不 在循环中检查等待条件,程序就会在没有满足结束条件的情况下 退出。因此,当一个等待线程醒来时,不能认为它原来的等待状 态仍然是有效的,在 notify方法调用之后和等待线程醒来之前这 段时间它可能会改变。这就是在循环中使用wait0方法效果更好 的原因。 18)ava中堆和栈有什么不同? 为什么把这个问题归类在多线程和并发面试题里?因为栈是 一块和线程紧密相关的内存区域。每个线程都有自己的栈内存, 用于存储本地变量,方法参数和栈调用,一个线程中存储的变量 对其它线程是不可见的。而堆是所有线程共享的一片公用内存区 域。对象都在堆里创建,为了提升效率线程会从堆中弄一个缓存 到自己的栈,如果多个线程使用该变量就可能引发问题,这时 volatile变量就可以发挥作用了,它要求线程从主存中读取变量的 值 19)什么是线程池?为什么要使用它? 创建线程要花费昂贵的资源和时间,如果任务来了才创建线 程那么响应时间会变长,而且一个进程能创建的线程数有限。为 了避免这些问题,在程序启动的时候就创建若干线程来响应处 理,它们被称为线程池,里面的线程叫工作线程。从JDK1.5开 始, JavaAPI提供了 Executor框架让你可以创建不同的线程池。 比如单线程池,每次处理一个任务;数目固定的线程池或者是缓 存线程池(一个适合很多生存期短的任务的程序的可扩展线程 池 20如何避免死锁? 死锁是指两个或两个以上的进程在执行过程中,因争夺资源 而造成的一种互相等待的现象,若无外力作用,它们都将无法推 进下去。这是一个严重的问题,因为死锁会让你的程序挂起无法 完成任务,死锁的发生必须满足以下凹个条件: ●互斥条件:一个资源每次只能被一个进程使用 ●清求与保持条件:一个进程因请求资源而阻塞时,对已获得 的资源保持不放 不剥夺条件:进程已获得的资源,在末使用完之前,不能强 行剥夺。 ●循环等待条件:若干进程之间形成一种头尾相接的循环等待 资源关系。 避免死锁最简单的方法就是阻止循环等待条件,将系统中所 有的资源没置标志位、排序,规定所有的进程申请资源必须以 定的顺序(升序或降序)做操作来避免死锁。 21)怎么检测一个线程是否拥有锁? 在 java.lang. Thread中有一个方法叫 holdslock0,它返回tue 如果当且仅当当前线程拥有某个具体对象的锁。 22VM中哪个参数是用来控制线程的栈堆栈小的 ⅩsS参数用来控制线程的堆栈大小 23)ava中 synchronized和 Reentrantlock有什么不同? Jaa在过去很长一段时间只能通过 synchronized关键字来实 现互斥,它有一些缺点。比如你不能扩展锁之外的方法或者块边 界,尝试获取锁时不能中途取消等。Jaa5通过Lock接口提供了 更复杂的控制来解决这些问题。 Reentrantlock类实现了Lock,它 拥有与 synchronized相同的并发性和内存语义且它还具有可扩展 性 24)有三个线程T1,T2,T3,怎么确保它们按顺序执行? 在多线程中有多种方法让线程按特定顺序执行,你可以用线 程类的join0方法在一个线程中启动另一个线程,另外一个线程完 成该线程继续执行。为了确保三个线程的顺序你应该先启动最后 个(T3调用T2,T2调用T1),这样T1就会先完成而T3最后完 成。 25) Thread类中的yd方法有什么作用? yield方法可以暂停当前正在执行的线程对象,让其它有相同 优先级的线程执行。它是一个静态方法而且只保证当前线程放弃 CPU占用而不能保证使其它线程一定能占用CPU,执行yld0的 线程有可能在进入到暂停状态后马上又被执行,所以yd不会 释放锁 26)如果你提交任务时,线程池队列已满。会时发会生什么? 事实上如果一个任务不能被调度执行那么 ThreadPo0 xecutor' submit0方法将会抛出一个 RejectedExecution Exception异常。 2刀Java线程池中 submit(和 execute0方法有什么区别? 两个方法都可以向线程池提交任务, executel0方法的返回类 型是void,它定义在 Executor接口中,而 submit0方法可以返回 持有计算结果的 Future对象,它定义在 Executor Service接口中, 它扩展了 Executor接口,其它线程池类像 ThreadPoolExecutor和 Scheduledthreadpoolexecutor都有这些方法。 28)什么是阻塞式方法? 阻塞式方法是指程序会一直等待该方法完成期间不做其他事 情, ServerSocket的acep0方法就是一直等待客户端连接。这里 的阻塞是指调用结果返回之前,当前线程会被挂起,直到得到结 果之后才会返回。此外,还有异步和非阻塞式方法在任务完成前 就返回。 29)如果同步块内的线程抛出异常会发生什么? 无论你的冋步块是正常还是异常退出的,里面的线程都会释 放锁,所以对比锁接口我更喜欢同步块,因为它不用我花费精力 去释放锁,该功能可以在 finallyblock里释放锁实现。 30)单例模式的双检锁是什么? 它其实是一个用来创建线程安全的单例的老方法,当单例实 例第一次被创建时它试图用单个锁进行性能优化。 31)如何在JaVa中创建线程安全的 Singleton? 可以利用JM的类加载和静态变量初始化特征来创建 Singleton实例,或者是利用枚举类型来创建 Singleton 32)如何强制启动一个线程? 这个问题就像是如何强制进行java垃圾回收,目前还没有觉 得方法,虽然你可以使用 System.gc0来进行垃圾回收,但是不保 证能成功。在Java里面没有办法强制启动一个线程,它是被线程 调度器控制着且Java没有公布相关的APⅠ 33)ava多线程中调用wit0和sepO方法有什么不同? Jaa程序中wait和slep都会造成某种形式的暂停,它们可 以满足不同的需要。wait0方法用于线程间通信,如果等待条件为 真且其它线程被唤醒时它会释放锁,而slep方法仅仅释放CPU 资源或者让当前线程停止执行一段时间,但不会释放锁。 34)什么是多线程编程?什么时候使用? 多线程一般用于当一个程序需要冋时做一个以上的任务。多线 程通常用于GUⅠ交互程序。一个新的线程被创建做一些耗时的工 作,当主线程保持界面与用户的交互 35)可以重载st方法么? 可以重载,重载后还要重载run()方法。

...展开详情
试读 21P java多线程面试题
立即下载 低至0.43元/次 身份认证VIP会员低至7折
    抢沙发
    一个资源只可评论一次,评论内容不能少于5个字
    • 签到新秀

      累计签到获取,不积跬步,无以至千里,继续坚持!
    • 分享小兵

      成功上传3个资源即可获取
    关注 私信 TA的资源
    上传资源赚积分,得勋章
    最新推荐
    java多线程面试题 50积分/C币 立即下载
    1/21
    java多线程面试题第1页
    java多线程面试题第2页
    java多线程面试题第3页
    java多线程面试题第4页
    java多线程面试题第5页
    java多线程面试题第6页
    java多线程面试题第7页

    试读已结束,剩余14页未读...

    50积分/C币 立即下载 >