您的位置:首页 > 职场人生

关于线程相关的一些理解和常见面试题

2017-11-27 14:43 489 查看
网上一张关于线程的图,我认为很方便理解线程:



常见面试题:

一、wait和sleep的区别?

答:1:wait是object类的方法,sleep是Thread类方法。

       2:sleep不会释放当前线程的锁,wait会释放当前线程的锁。所以 wait一般用在同步方法中或者同步块中,sleep可以用在各种地方。

       3:wait需要notify或者notifyAll方法才能唤醒,sleep会在睡眠时间过后醒来,或者调用interrupt()强行打断。Thread.sleep(0)的作用是“触发操作系统立刻重新进行一次CPU竞争”

   共同点:都可以暂停线程,让出cup资源。

二、synchronized和lock的区别?

答:

 synchronizedLock
存在层次Java的关键字,在jvm层面上是一个类
锁的释放1、以获取锁的线程执行完同步代码,释放锁 2、线程执行发生异常,jvm会让线程释放锁在finally中必须释放锁,不然容易造成线程死锁
锁的获取假设A线程获得锁,B线程等待。如果A线程阻塞,B线程会一直等待分情况而定,Lock有多个锁获取的方式,具体下面会说道,大致就是可以尝试获得锁,线程可以不用一直等待
锁状态无法判断可以判断
锁类型可重入不可中断非公平可重入可中断可公平(两者皆可)
性能少量同步大量同步

三、lock和ReentrantLock

lock是一个接口类,ReentrantLock是lock接口的一个实现类。

ReentrantLock获取锁定与三种方式:

a) lock(), 如果获取了锁立即返回,如果别的线程持有锁,当前线程则一直处于休眠状态,直到获取锁

b) tryLock(), 如果获取了锁立即返回true,如果别的线程正持有锁,立即返回false;

c) tryLock(long timeout,TimeUnit unit), 如果获取了锁定立即返回true,如果别的线程正持有锁,会等待参数给定的时间,在等待的过程中,如果获取了锁定,就返回true,如果等待超时,返回false;

d) lockInterruptibly:如果获取了锁定立即返回,如果没有获取锁定,当前线程处于休眠状态,直到或者锁定,或者当前线程被别的线程中断
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 面试题 线程