Java-synchronized
多线程
关键词概念
线程饥饿:某些线程优先级过低,导致永远无法得倒运行
守护线程与用户线程:用户线程会阻止jvm的正常停止,守护线程重要性不高,一般用来做监控,是否守护线程父线程决定。
工作线程(后台线程):用户执行特定任务。
多线程编程的优缺点
- 优点:提高系统吞吐率、响应性、多核处理资源、最小化对系统资源的使用、简化程序结构
- 缺点(风险):线程安全、线程活性(死锁与活锁)、上下文切换(额外资源消耗)、可靠性
串发(顺序执行)、并发(宏观同时运行,微观轮流运行)、并行(严格同时进行)
竞态(Race Condition):计算结果的正确性依赖于相对时间顺序或者线程的交错(多个线程对共享变量进行修改)。
原子性:一个线程对共享变量的更新,从另一个线程的角度来看,它要么完成,要么尚未发生。
可见性:一个线程对共享变量的更新对于另一个线程而言是否可见
重排序:1.分配对象的内存空间,2.初始化对象instance,3.设置instance指向刚分配的内存地址.2和3可能发生重排序,可能出现线程安全问题。
上下文切换:一个线程被暂停,即被剥夺处理器的使用权,另外一个线程被选中开始或者继续运行的过程
非公平调度策略(吞吐量大/申请资源时间长容易导致饥饿现象)与公平调度策略(相反)
临界区:锁的持有线程在其获得锁之后和释放锁之前的这段时间内所执行的代码被称为临界区。
内部锁(synchronized):内部锁表现为整体并发中的局部串行
显示锁(Lock接口):多读单写
并发集合
- ArrayList—-CopyOnWriteArrayList 快照实现遍历
- HashSet—CopyOnWriteArraySet 快照实现遍历
- LinkedList—ConcurrentLinkedQueue 准实时
- HashMap—ConcurrentHashMap 准实时
- TreeMap—ConcurrentSkipListMap 准实时
- TreeSet—ConcurrentSkipListSet 准实时
捕获线程异常不用
try catch
,用UncaughtExceptionHandler