本文已参与「新人创作礼」活动,一起开启掘金创作之路。
个人简介:微信公众号关注:SteveCode。为您分享更多的知识学术。生于忧患死于安乐 专注Java技术干货分享,Java基础技术、数据结构、相关工具、Spring全家桶、intellij idea......
文章面试题整理出自:Java 最常见的 200+ 面试题:面试必备_Java中文社群的博客-CSDN博客_java面试题
要么做好要么不做
守护线程就是运行在后台的一种特殊进程。Java中垃圾回收线程也是特殊的守护线程。
39.说一下 runnable 和 callable 有什么区别?
相同点:两者都是接口、两者都是用来编写多线程、两者都是用Thread.start()启动线程。
不同点:runnable中run方法没有返回值,callable接口中call方法需要返回值。
public interface Callable { V call() throws Exception; }
public interface Runnable { public abstract void run(); }
对象锁:sleep()不能释放锁资源,wait可以释放锁资源
唤醒线程方式:sleep()到时间自动恢复,wait需要使用notify 或者notifyAll唤醒线程。
使用范围:sleep()可以在任何地方使用,wait()只能咋同步代码与同步方法上使用。
42.notify()和 notifyAll()有什么区别?
如果对象调用wait()方法,那么对象就会进入等待池中。等待池中的线程不会去竞争对象锁。
notify()唤醒一个线程去锁池中去竞争对象锁,notifyAll()是唤醒所有线程进入锁池中,去竞争对象锁。
run()指的是执行线程的运行代码。start()启动某一线程。
创建一个可以缓存的的线程池newCachedThreadPool
创建一个单线程的线程池newSingleThreadExecutor
单单线程可以周期执行任务的线程池:newSingleThreadScheduledExecutor
创建有个指定数目的线程池:newFixedThreadPool 定长
创建一个可以周期执行任务的线程池:newScheduledThreadPool
Runtime、 SHUTDOWN、STOP、TIDYING 、TERMINATED
46.线程池中 submit()和 execute()方法有什么区别?
所在类不同:submit()在abstractExecuteService方法中,execute()在Executor中。
返回值:submit()有返回值,execute()没有返回值
execute()public interface Executor { void execute(Runnable command); } submit() public abstract class AbstractExecutorService implements ExecutorService { public Future<?> submit(Runnable task) {} public Future submit(Callable task) {} }
使用线程安全的类:Hashtable、vector、或者java.util.concurrent 下面的线程安全类;
无锁---偏向锁---轻量级锁---重量级锁,随着竞争情况,锁的状态逐渐升级,状态不能降级。blog.csdn.net/weixin_4292…
如果A线程持有a锁,B线程持有b锁,他们俩之间想相会持有对方锁,从而产生了相互等待现象。称为死锁。
使用并发类代替代替手写锁:java.util.concurrent。
ThreadLocal是线程本地存储,每一个线程都会有一个ThreadLocalMap对象,每个线程都可以访问ThreadlocalMap中的 value
场景,每一个jdbc链接Connection,每一个线程都会有自己的connection进行数据库的操作。
53.synchronized 和 volatile 的区别是什么?
修饰上:synchronization 可以修饰代码块,类、方法、变量
阻塞上:synchronization会产生阻塞,volatile不会产生阻塞。
synchronization可以保证修改可见性与原子性,volatile可以实现修改可见性,不能保证原子性
来源上:synchronization是一个关键字,Lock是一个接口
异常是否释放锁:synchronization出现异常时会释放锁,lock出现异常时不会释放锁,我们需要在try catch finally{调用 unlock}开启释放锁
55.synchronized 和 ReentrantLock 区别是什么?
获取锁:前者竞争锁时一直等待,后者可以尝试获取锁,并获取结果
公平锁:前者不能实现公平锁。后者可以实现公平锁,先等待先获取
唤醒的方式不同:前者wait() notify() notifyAll(),后者 await()signal()signalAll()
释放锁:前者在代码执行完了之后或者抛出异常会自动释放锁,后者不会自动释放锁,finally{unlock}去释放锁