1、Runable的局限抽象-------> 不能返回一个值或抛出一个受检查的异常
2、取消和中断: 没有抢占式中断,会推给开发人员的Interrupted异常;推迟中断,请求处理
3、避免使用守护线程----> JVM会直接退出
4、避免使用终结器----> 除了本地方法,要使用finally代码块用close()进行退出
5、悲观锁-->写操作多; 乐观锁-->读操作多,效率高 ⬆️
6、自旋锁和非自旋锁的区别: 是否一直占用CPU资源
7、锁升级的过程
无锁----->偏向锁----->轻量级锁----->重量级锁
偏向锁: Mark world 解决避免执行CAS
轻量级锁: CAS + 自旋 解决加锁问题,避免线程阻塞和唤醒影响性能
8、公平锁与非公平锁: 插不插队的区别
9、ReentrantReadWriteLock : 读锁(共享锁) 、 写锁(独占锁)
10、尽量使用默认线程优先级,在并发应用程序中,通过等待随机长度的时间和回退可以有效地避免活锁 (相互谦让,不断出现错误,不断回滚) 的发生 ** 安全性 > 更好的性能
11、更有效地利用现有处理资源,以及在出现新的处理资源时使程序尽可能地利用这些新资源
---------- 指标: 服务时间、延迟时间、吞吐率、效率、可伸缩性、容量
12、线程之间协调: 例如加锁,触发信号以及内存同步 1> 增加上下文切换,线程创建和销毁,线程调度
13、这种单一的应用程序避免了在不同层次之间传递任务时存在的网络延迟,同时也不需要将计算过程分解到不同的抽象层次,因此减少了许多开销
14、活跃性问题: 死锁 ---->
** 不能循环抱团上锁 **锁的顺序一定不会发生死锁。** 不要动态传递锁的标志
15、如果在持有锁的情况下调用某个外部方法,那么就需警惕死锁
16、依赖通过构造一些协议(而不是通过锁)来防止其他线程进入代码临界区
17、尽量减少潜在的加锁交互数量,将获取锁时需要遵循的协议写入正式文档并始终遵循这些协议 代码审查/自动化源代码分析
18、开放调用。保证锁顺序一致,尽量可以减少锁数量
19、tryLock 可以超过不进行永久等待下去 <定时锁>
20、并发优化点:
1> 减少锁的粒度 2>缩小锁的范围 3>锁分段 4>避免热点域 5> 放弃使用独占锁<使用并发容器,读-写锁,不可变对象以及原子变量>
21、减少锁的持有时间,降低锁的粒度,以及采用非独占的锁或非阻塞锁来代替独占锁
22、ReentrantLock: 可定时 可轮询
23、在内置锁中,死锁时一个严重的问题,回复程序的唯一方法是重启程序,而防止死锁的唯一方法是在构造程序时避免出现不一致的锁顺序
24、闭锁: 同一时间是否完成; 栅栏: 多个数据汇总完成; 信号量: 资源池多个许可
25、perbar给出CPU忙碌程度的信息,本质上是串行的任务,无法通过增加处理器数量而提升性能
26、在所有并发程序中都包含一些串行部分,如果你认为在你的程序中不存在串行部分,那么再检查一遍
27、对于为了提升性能而引入的线程来说,并行带来的性能提升必须超过并发导致的开销
28、在并发程序中,对可伸缩性的最主要威胁就是独占方式的资源锁。竞争: 锁的请求频率、锁的时间
29、happen-before原则:
1、单一线程原则: (一个线程内,前面操作先于后面)
2、管程锁定规则:(unlock先行发生同一lock)
3、volatile变量规则: (对volatile写操作先于对它读操作)
4、线程启动规则:(线程的start方法优于其每一个动作)
5、线程加入规则: (Thread对象结束先行发生于join()方法返回)
6、线程中断规则: (对线程interrupt()方法调用先行发生于被中断线程代码直捣中断事件的发生)
7、对象终结规则: (一个对象初始化完成先行发生于它的finalize()方法的开始)
8、传递性: (A先于B、B先于C、A先于C)
暑期编程PK赛 得CSDN机械键盘等精美礼品!


