- Java 存储模型明确地规定了在什么时机下,操作存储器的线程的动作可以保证被另外的动作看到。
- 规范还规定了要保证操作是按照一种偏序关系进行排序。这种关系称为 happens-before,它是规定在独立存储器和同步操作的级别之上的。
1 | value = 100 |
在多线程环境中,要获取到 value 的正确值,需要用到同步。
volatile 变量
volatile
变量与锁相比是更轻量的同步机制,因为它们不会引起上下文的切换和线程调度。take
方法依赖于这个阻塞队列中有至少一个元素这个状态。Lock
接口:
1 | public interface Lock { |
Lock 提供了无条件的、可轮询的、定时的、可中断的锁获取操作,所有加锁和解锁的方法都是显式的。
性能可伸缩性: 多线程能充分的发挥出闲置的处理能力,使现有任务正在运行的情况下立刻开始着手处理新的任务,提高系统的响应性。
Amdahl 定律:
N 表示处理器数量,F表示串行化任务的比重。
jcmd PID号 Thread.print
输出线程和锁信息,分析死锁原因。Executor 框架可以将任务的提交
与任务的执行
策略解耦开来。Executor 框架为制定和修改执行策略提供了相当大的灵活性,但并非所有的任务都能适用所有的执行策略。 有些类型的任 务需要明确地指定执行策略, 包括:
依赖性任务:简单来说就是,提交的 task
是需要依赖 其它任务
的, task
就类似有某种枷锁一样,浑身不自在。