山西成宁做的网站,网站底部模板源码,凡科做网站友情链接怎么做,百度没有收录我的网站吗【0】README0.1#xff09;本文部分文字描述转自“java并发编程实践”#xff0c;旨在学习“java并发编程实践(1)intro”的相关知识#xff1b;【3】线程带来的风险【3.1】安全性问题1#xff09;intro#xff1a;在没有充足同步的case下#xff0c;多个线程的操作执行顺…【0】README0.1本文部分文字描述转自“java并发编程实践”旨在学习“java并发编程实践(1)intro”的相关知识【3】线程带来的风险【3.1】安全性问题1intro在没有充足同步的case下多个线程的操作执行顺序是不可预测的2看个荔枝public class UnsafeSequence
{private int value;public int getNext(){return value;}
}对以上代码的分析Analysis上述类的问题在于如果执行时机不对那么两个线程在调用 getNext方法时会得到相同的值如下图所示对上图的分析AnalysisA1虽然递增运算 value 看上去是单个操作但事实上它包含3个独立的操作读取value将value加1并将计算结果写入value由于运行时可能将多个线程之间的操作交替执行因此这两个线程可能同时执行读操作从而使得他们得到相同的值并都将这个值加1.结果就是在不同线程的调用中返回了相同的数值 A2上面的交替执行示意图给出的是最糟糕的执行case目的是为了说明如果错误地假设程序中的操作将按照某种特定顺序来执行那么会存在各种可能的危险 A3在UnsafeSequence类中说明的是一种常见的并发安全问题称为竞态条件因为在刚刚的荔枝中getValue()方法是否返回唯一值要取决于运行时对线程中操作的交替执行方式这并不是我们希望看到的case干货——引入竞态条件 3由于多个线程要共享相同的内存地址空间并且是并发运行因此它们可能会访问或修改其他线程正在使用的变量4当多个线程同时访问和修改相同变量时将会在串行编程模型中引入非串行因素而这种非串行性是很难分析的。要使多线程程序的行为可以预测必须对共享变量的访问操作进行协同这样才不会在线程之间发生彼此干扰。幸运的是java 提供了各种同步机制来协同这种访问干货——引入对共享变量的协同访问操作看个荔枝线程安全的数值序列生成器public class SafeSequence {private int value;public synchronized int getNext(){return value;}
}【3.2】活跃性问题1定义某件正确的事情最终会发生2安全性的含义是永远不发生最糟糕的事情而活跃性则关注与另一个目标即“某件正确的事情最终会发生”3当某个操作无法继续执行下去时就会发生活跃性问题。在串行程序中活跃性问题的形式之一是无意中造成的无限循环从而使得循环之后的代码无法得到执行。4线程将带来一些其他活跃性问题如如果线程A在等待线程B 释放其特有的资源而线程B永远都不释放该资源那么A 就会永久地等待下去【3.3】性能问题1intro希望正确的事情尽快发生讲究的是效率2性能问题包括多个方面如服务时间过长响应不灵敏吞吐率过低资源消耗过高或者可伸缩性较低等3线程总会带来某种程度的运行时开销在多线程程序中当线程调度器临时挂起活跃线程并转而运行另一个线程时就会频繁地出现上下文切换操作这种操作将带来极大的开销保存和回复执行上下文丢失局部性并且CPU 时间将更多地花在线程调度而不是线程运行上干货——一个常见的荔枝当跑hadoop的时候发现单节点比多节点用的时间还少就是这个原因因为不断进行上下文切换会带来极大的性能开销