多线程的出现是要解决什么问题?
CPU、内存、I/O设备的速度是有极大的差异,为了合理利用CPU的高性能,平衡三者的速度差异。
1.CPU增加缓存,以均衡与内存的速度差异,导致可见性问题
2.操作系统增加进程、线程,以分时复用CPU,进而均衡CPU与I/O设备的速度的差异,导致原子性问题
3.编译程序优化指令执行次序,使得缓存能够更加合理地利用,导致有序性问题。
线程不安全指什么?
如果多个线程对同一个共享数据进行访问而不采取同步操作的话,那么操作结果是不一样的。
并发出现现场不安全的本质是什么?
1.CPU缓存引起的可见性问题
2.分时复用引起的原子性问题
3.指令重排序引起的有序性问题
怎么解决并发问题?
1.volatile、synchronized关键字和Happens-Before规则以及as-if-serial原理
2.可见性,有序性,原子性
线程安全实现方法
1.互斥同步 synchronized,ReentrntLock
2.非阻塞同步 CAS,Atomic类
3.无同步方案 栈封闭、线程本地存储、可重入代码
线程有哪几种使用方式?
1.实现Runnable接口
2.实现Callable接口
3.继承Thread类
线程的互斥同步方式有哪些?如何比较和选择
1.锁的视线 synchronized是JVM实现的,而ReentrantLock是JDK实现的
2.性能 java对synchronized进行了很多优化,例如自旋锁,synchronized 与 ReentrantLock 大致相同。
3.等待可中断 当持有锁的线程长期不释放锁的时候,正在等待的线程可以选择放弃等待,改为处理其他事情。ReentrantLock 可中断,而 synchronized 不行。
4.锁绑定多个条件 一个 ReentrantLock 可以同时绑定多个 Condition 对象。
5.公平锁 公平锁是指多个线程在等待同一个锁时,必须按照申请锁的时间顺序来依次获得锁。
synchronized 中的锁是非公平的,ReentrantLock 默认情况下也是非公平的,但是也可以是公平的。
6.除非需要使用 ReentrantLock 的高级功能,否则优先使用 synchronized。这是因为 synchronized 是 JVM 实现的一种锁机制,JVM 原生地支持它,而 ReentrantLock 不是所有的 JDK 版本都支持。并且使用 synchronized 不用担心没有释放锁而导致死锁问题,因为 JVM 会确保锁的释放。