java并发编程实战学习 第1章
java并发编程实战学习
第一章 简介
- 并发简史
操作系统带来了并发程序,操作系统之前只能从头到尾执行一个程序
- 线程的优势
-
发挥多处理器的强大能力 建模的简单性 异步事件的简化处理 响应更灵敏的用户界面
- 线程带来的风险
-
安全性问题
线程不安全情况
@NotThreadSafe public class UnsafeSequence { private int value; /** 返回一个唯一的数 **/ public int getNext() { return value++; } }
value++包含了3个独立操作:读取value,将value加1,并将计算结果写入value。由于运行时可能将多个线程之间交替执行,因此这两个线程可能同时执行读操作,从而使得它们得到相同的值,并都将这个值加1。
这种称为竞态条件。
多线程要共享相同的内存空间地址,并且时并发运行,因此它们可能会访问或修改其他线程正在使用的变量。由于无法预测数据变化从而发生错误。要预测的话,必须对共享变量的访问进行协同。Java提供了各种同步机制来协同这种访问。
线程安全的情况
@TreadSafe public class Sequence { @GuardedBy("this") private int value; public synchronized int getNext() { return value++; } }
如果没有同步,那么无论是编译器、硬件还是运行时,都可以随意安排操作的执行时间和顺序,例如对寄存器或者处理器中的变量进行缓存,而这些被缓存的变量对于其他线程来说是暂时(甚至永久)不可见的。
-
活跃性问题
一个线程一直等着另一个线程释放资源
-
性能问题
带来额外的开销,线程调度。同步后抑制某些编译器优化。
- 线程无处不在
就是到处都是
上一篇:
IDEA上Java项目控制台中文乱码