线程并发和集合相关面试题总结

线程并发相关面试题

1:进程和线程的区别?

  1. 进程是资源分配的基本单位,线程是程序执行的最小单位
  2. 进程有独立的地址空间,线程依托于进程存在,线程切换的开销小
  3. 多进程组成的服务更稳定,一个进程挂了不会对另一个进程造成影响,相反,一个线程挂了,依托该进程的所有线程都会崩溃

2:进程间通信方式?

  • 管道
  • 信号量
  • 消息队列
  • 共享内存(IPC)
  • socket

核心目的是交换数据

Q:线程间通信方式?

  • 锁机制
  • 信号量

核心目的是同步

3:Callable、Runnable区别?

  1. 核心区别 Callable 有返回值,Runnable 没有返回值
  2. Callable的方法是call(),而 Runnable的方法是run()
  3. Callable可以抛出异常,而 Runnable不可以抛出异常

4:Future和Callable的关系?

  • Callable执行完后会有一个返回结果,可以通过Future类返回(异步计算的结果)。
  • 此外,应当了解下FutureTask,其实现了Runnable和Future,并存在接收Callable的构造函数

5:创建线程的方法?

  1. 继承Thread,再通过Thread的start()
  2. 实现Runnable,再通过new Thread(runnable)包装后,start()
  3. 用ExecutorService提交

6:volatile关键字的作用?

  1. 防止指令重排(单例模式中)
  2. 内存可见性

7:synchronized的用法?

  1. 修饰实例方法,作用于当前对象,两个不同对象不冲突
  2. 修饰静态方法,作用于当前类,两个不同对象也冲突
  3. 修饰代码块,对指定对象加锁

8:CountDownLatch和CyclicBarrier了解吗?

  • CountDownLatch中一个线程等待其他几个线程完成。
  • CyclicBarrier中几个线程相互等待某一事件的达成。
  • CyclicBarrier可以复用。

9:ThreadLocal作用?

修饰变量,控制变量作用域,使变量在同一个线程内的若干个函数中共享。

10:单例与多例的区别?

  1. 单例非static和static变量都是线程不安全的
  2. 多例非static变量是线程安全的,但static变量依旧是线程不安全的
  3. 可以通过synchronized或ThreadLocal来完成static变量的线程安全

11:锁释放的时机?

  1. 执行完同步代码块后
  2. 执行同步代码块途中,发生了异常,导致线程终止
  3. 执行同步代码块途中,遇到wait关键字,该线程释放对象锁,当前线程会进入线程等待池中,等待被唤醒

12:notify唤醒时机?

notify后不会立刻唤醒处于线程等待池中的线程,而是等当前同步代码块执行完,才释放当前的对象锁,并唤醒等待线程。

13:notify和notifyAll区别?

notify通知一个线程获取锁,而notifyAll通知所有相关的线程去竞争锁

14:讲一下Lock?

Lock是为了弥补synchronized的缺陷而诞生的,主要解决两种场景

  1. 读写操作,读读不应该互斥
  2. 避免永久的等待某个锁

Lock是一个类,并非Java本身带的关键字,相对于synchronized而言,需要手动释放锁。

15:锁的种类?

  1. 可重入锁,如ReentrantLock
  2. 可中断锁,lockInterruptibly()反应了Lock的可中断性
  3. 公平锁,synchronized是非公平锁,Lock默认也是非公平锁(可调整)
  4. 读写锁,如ReadWriteLock

集合相关面试题

1:TreeSet特性?

内部元素通过compare排序。

2:LinkedHashMap特性?

内部有个双向链表维护了插入key的顺序,使得map能够依据插入key的顺序迭代。

3:ArrayList与Vector的差别?

ArrayList是非线程安全的,Vector是线程安全的。

4:LinkedList与ArrayList的差别?

  1. LinkedList基于链表,ArrayList基于数组
  2. LinkedList没有随机访问的特性
  3. ArrayList删除添加元素没有LinkedList高效

5:HashMap与HashTable的差别?

  1. HashTable线程安全,HashMap线程不安全
  2. HashMap允许null key和value,而HashTable不允许

6:Set与List的差别?各自有哪些子类?

Set不允许重复元素,List允许重复元素,List有索引

  • Set:HashSet、LinkedHashMap、TreeSet
  • List:Vector、ArrayList、LinkedList

7:hashCode()、equals()、==区别?

  1. equals 比较两个对象是否相等,若相等则其hashCode必然相等
  2. 若两个对象的hashCode不等,则必然不equals
  3. ==比较内存地址,比较是否是同一对象

8:Java容器中添加的对象是引用还是值?

引用

9:Iterator和ListIterator的区别?

  1. ListIterator 能向前遍历,也能向后遍历
  2. 可以添加元素
  3. 可以定位当前index

10:HashMap实现?

  • hashing的概念
  • HashMap中解决碰撞的方法(拉链法)
  • equals()和hashCode()的应用,在HashMap中到底如何判断一个对象有无
  • 不可变对象的好处
  • HashMap多线程的条件竞争
  • 重新调整HashMap的大小

11:ConcurrentHashMap和HashTable区别?

  1. HashTable通过synchronized来实现线程安全
  2. ConcurrentHashMap通过分段锁,仅锁定map的某一部分

猜你喜欢

转载自blog.csdn.net/weixin_42228950/article/details/83306347
今日推荐