You may be disappointed if you fail, but you are doomed if you don't try.
如果你失败了你也许会失望,但如果你不尝试,你就完了。
-
线程的存在是为了并行
- jvm虚拟机其实运行了许多线程
-
并发和并行
- 其实外在表象是相同的,并发是一起走,并行是轮转
临界区 阻塞 非阻塞
-
死锁是一个静态的问题,不会再继续下去。不会再占用更多cpu
- 抢占资源不释放
- 等待共享资源
饥饿 类似于电梯遇人。
-
活锁
- 是一个动态的问题,线程不断释放、获取资源。一直在尝试获取资源
- 原子操作一直等待
-
无障碍
- 宽进严出 如果冲突必须要回滚数据,所有线程都会进入临界区
- 会不断的重试
- 所有的线程相当于拿去当前的快照,会一直尝试,知道拿到一个有效的快照
-
无锁
- 无锁必须要是无障碍的,保证有一个线程可以正常执行,不至于所有的线程都一直在竞争资源、快照
-
无等待
- 无锁
- 要求所有临界区线程都可以在有限步完成,而且要求都在有限步当中完成操作
- 无饥饿
- 举例
- 比如说读写、读是无等待的,但是写会影响读,为了不影响读,就拷贝一份副本去修改,所以修改过程不会影响读,这样读线程仍然是无等待的
- 写也是无等待的,他们不用相互同步。唯一有问题的是覆盖回原始数据的时候,只是更改引用/指针去替换,但是他很快。
-
阻塞
- 这个线程操作数据,必然会影响其他线程。
Thread实现了runnable
如何优雅的终止一个线程 interupt()
-
为何线程的操作都需要抛出异常
- 如果被中断的时候可以立即作出响应,比如tread.sleep()
-
其实是java jvm层面的去调用notifyAll
- 唤醒等待在当前线程上的所有线程
- 当然 wait notifyAll 不要用在自己的线程实例上线
- 换句话说,就是不一定能达到预期的目的