一、进程和线程区别
| 进程 | 线程 |
调度 | 拥有资源的基本单位 | CPU调度和分配的基本单位 |
并发性 | 进程之间可并发执行 | 同进程间多线程也可并发执行 |
系统开销 | 大(系统分配和回收资源+创建和撤销线程) | 小(创建和撤销开销) |
拥有资源 | 拥有资源 | 不拥有,但可访问隶属于进程的资源 |
二、Callable和Runnable区别
| Callable | Runnable |
规定方法 | call() | run() |
返回值 | 可有可没有 | 没有 |
抛出异常 | 可抛 | 不能抛出异常 |
Future类 | 使用Callable需要与Future类配合使用。运行Callable任务可拿到一个Future对象,Future表示异步计算的结果。 |
|
三、sleep()和wait()区别
| sleep() | wait() |
持有者 | Thread的静态方法,休眠指定时间 | Object的方法,任何对象都可调用,挂起,notify/notifyAll唤醒 |
时间参数 | 必加休眠时间参数 | 可加可不加 |
同步锁释放 | 一直持有,继续占用CPU资源 | 释放同步锁 |
synchronized搭配使用 | 可在任何地方执行 | wait,notify,notifyAll只能在同步控制方法和同步控制块里使用 |
四、volatile和synchronized区别
| volatile | synchronized |
修饰对象 | 只能修饰变量 | 可修饰方法以及代码块 |
是否出现阻塞 | 多线程访问volatile不出现 | 会出现阻塞 |
数据可见性和原子性 | 能保证数据可见性,但不保证原子性(double和long除外) | 保证原子性,也间接保证可见性 |
性能 | 线程同步的轻量级实现,性能比synchronized好 | —— |
五、synchronized和lock区别(ReentrantLock,互斥锁,可重入锁)
| synchronized | lock |
| 关键字,在JVM层面实现对临界资源的同步互斥访问,通过对对象的头文件操作达到获取和释放锁 | 基于JDK层面实现的接口,是concurrent包下的类 |
获取锁和释放锁,死锁发生 | s在在进入同步方法或同步代码块会自动获取锁,返回同步方法或退出同步代码块自动释放锁,不会发生死锁 | 必须显示获得锁,一定要在finally中通过unlock()显示释放锁,否则可能造成死锁 |
锁状态 | 无法判断 | 可知是否成功获得锁 |
锁类型 | 可重入,不可中断,非公平 (默认非公平,无法改变) | 可重入,可中断,可公平 (默认非公平,可实现公平锁,扩展性好) |
响应中断 | 线程阻塞时无法响应中断 | RL获取锁的过程中能保持对中断的请求,抛出中断异常,同时锁释放 |
块结构加锁 | s方法和s块都是基于块结构加锁 | RL可用于非块结构加锁(例concurrentHashMap中的Segment分段锁机制,CAS+Synchronized) |
六、ArrayList和LinkedList区别
| ArrayList | LinkedList |
相同点 | 都实现List接口 | |
数据结构 | 可改变大小的数组,基于索引 | 双向链表 |
get,delect,插入 | 获得数据时间复杂度O(1),删除O(n),插入最坏O(n) | 获得数据最坏O(n),删除O(1),插入O(1) |
内存 |
| 更多 |
七、ArrayList和Vector区别
| ArrayList | Vector |
相同点 | 都实现List接口,List继承Collection接口,都有序,动态数组 | |
同步性 | 线程不安全,读取快 | 线程安全,读取慢 |
扩容 | 默认增长1.5倍,没有提供设置增长空间大小 | 默认增长2倍,可设初始空间大小,还可设增长空间大小 |
七、HashMap和Hashtable区别
| HashMap | Hashtable | |
相同点 | 存储结构,都是用哈希表存储键值对 解决哈希冲突方法一样 | ||
key和value值 | 允许为null | 不允许为null | |
同步 | 不同步,适应单线程环境,不是线程安全 | 同步,适应多线程,方法加synchronized | |
大小和扩容 | 默认数组大小为16,要求底层数组容量为2的整数次幂(hash值发生碰撞概率小),扩容时为原2倍 | 默认数组大小为11,不要求容量为2的整数次幂,扩容为原容量2n+1 <<+1 | |
哈希值使用 | 位运算获得哈希 | 直接使用对象的hashcode,取模哈希 | |
七、Hashtable和ConcurrentHashMap区别
https://www.cnblogs.com/heyonggang/p/9112731.html
| ConcurrentHashMap | Hashtable |
相同点 | 线程安全 | |
底层存储机构 | jdk1.6 Segment数组+HashEntry数组+链表(锁分段机制,继承ReentrantLock) jdk1.8 数组+链表+红黑树(抛弃分段锁机制,采用CAS+Synchronized) | 哈希表 数组+链表 |
加锁 | 内部使用同步机制基于lock操作。。。。。 | Synchronized关键字,对对象加锁,锁住对象整体(map),大小增加到一定程度,性能急速下降,,迭代时需要被锁很久 |