线程并发相关面试题
1:进程和线程的区别?
- 进程是资源分配的基本单位,线程是程序执行的最小单位
- 进程有独立的地址空间,线程依托于进程存在,线程切换的开销小
- 多进程组成的服务更稳定,一个进程挂了不会对另一个进程造成影响,相反,一个线程挂了,依托该进程的所有线程都会崩溃
2:进程间通信方式?
- 管道
- 信号量
- 消息队列
- 共享内存(IPC)
- socket
核心目的是交换数据
Q:线程间通信方式?
- 锁机制
- 信号量
核心目的是同步
3:Callable、Runnable区别?
- 核心区别 Callable 有返回值,Runnable 没有返回值
- Callable的方法是call(),而 Runnable的方法是run()
- Callable可以抛出异常,而 Runnable不可以抛出异常
4:Future和Callable的关系?
- Callable执行完后会有一个返回结果,可以通过Future类返回(异步计算的结果)。
- 此外,应当了解下FutureTask,其实现了Runnable和Future,并存在接收Callable的构造函数
5:创建线程的方法?
- 继承Thread,再通过Thread的start()
- 实现Runnable,再通过new Thread(runnable)包装后,start()
- 用ExecutorService提交
6:volatile关键字的作用?
- 防止指令重排(单例模式中)
- 内存可见性
7:synchronized的用法?
- 修饰实例方法,作用于当前对象,两个不同对象不冲突
- 修饰静态方法,作用于当前类,两个不同对象也冲突
- 修饰代码块,对指定对象加锁
8:CountDownLatch和CyclicBarrier了解吗?
- CountDownLatch中一个线程等待其他几个线程完成。
- CyclicBarrier中几个线程相互等待某一事件的达成。
- CyclicBarrier可以复用。
9:ThreadLocal作用?
修饰变量,控制变量作用域,使变量在同一个线程内的若干个函数中共享。
10:单例与多例的区别?
- 单例非static和static变量都是线程不安全的
- 多例非static变量是线程安全的,但static变量依旧是线程不安全的
- 可以通过synchronized或ThreadLocal来完成static变量的线程安全
11:锁释放的时机?
- 执行完同步代码块后
- 执行同步代码块途中,发生了异常,导致线程终止
- 执行同步代码块途中,遇到wait关键字,该线程释放对象锁,当前线程会进入线程等待池中,等待被唤醒
12:notify唤醒时机?
notify后不会立刻唤醒处于线程等待池中的线程,而是等当前同步代码块执行完,才释放当前的对象锁,并唤醒等待线程。
13:notify和notifyAll区别?
notify通知一个线程获取锁,而notifyAll通知所有相关的线程去竞争锁
14:讲一下Lock?
Lock是为了弥补synchronized的缺陷而诞生的,主要解决两种场景
- 读写操作,读读不应该互斥
- 避免永久的等待某个锁
Lock是一个类,并非Java本身带的关键字,相对于synchronized而言,需要手动释放锁。
15:锁的种类?
- 可重入锁,如ReentrantLock
- 可中断锁,lockInterruptibly()反应了Lock的可中断性
- 公平锁,synchronized是非公平锁,Lock默认也是非公平锁(可调整)
- 读写锁,如ReadWriteLock
集合相关面试题
1:TreeSet特性?
内部元素通过compare排序。
2:LinkedHashMap特性?
内部有个双向链表维护了插入key的顺序,使得map能够依据插入key的顺序迭代。
3:ArrayList与Vector的差别?
ArrayList是非线程安全的,Vector是线程安全的。
4:LinkedList与ArrayList的差别?
- LinkedList基于链表,ArrayList基于数组
- LinkedList没有随机访问的特性
- ArrayList删除添加元素没有LinkedList高效
5:HashMap与HashTable的差别?
- HashTable线程安全,HashMap线程不安全
- HashMap允许null key和value,而HashTable不允许
6:Set与List的差别?各自有哪些子类?
Set不允许重复元素,List允许重复元素,List有索引
- Set:HashSet、LinkedHashMap、TreeSet
- List:Vector、ArrayList、LinkedList
7:hashCode()、equals()、==区别?
- equals 比较两个对象是否相等,若相等则其hashCode必然相等
- 若两个对象的hashCode不等,则必然不equals
- ==比较内存地址,比较是否是同一对象
8:Java容器中添加的对象是引用还是值?
引用
9:Iterator和ListIterator的区别?
- ListIterator 能向前遍历,也能向后遍历
- 可以添加元素
- 可以定位当前index
10:HashMap实现?
- hashing的概念
- HashMap中解决碰撞的方法(拉链法)
- equals()和hashCode()的应用,在HashMap中到底如何判断一个对象有无
- 不可变对象的好处
- HashMap多线程的条件竞争
- 重新调整HashMap的大小
11:ConcurrentHashMap和HashTable区别?
- HashTable通过synchronized来实现线程安全
- ConcurrentHashMap通过分段锁,仅锁定map的某一部分