Java并发编程实战1,2章
添加时间:2013-6-16 点击量:
1. 促进过程和线程呈现的原因,是要解决以下题目:
- 资料哄骗率
- 公允性
- 便利性
2. 过程: 操纵体系为各个自力履行的过程分派各类资料,包含内存,文件句柄以及安然等。过程之间可以经由过程一些粗粒度的通信机制来互换数据,包含:套接字,旌旗灯号处理惩罚器,共享内 存,旌旗灯号量以及文件等。
3. 线程:线程容许在同一个过程中同时存在多个法度把握流。线程会共享过程局限内的资料,例如内存句柄和文件句柄,但每个线程都有各自的法度计数器,栈以及局部变量等。线程也被称为 轻量级的过程,在大多半现代操纵体系中,都是以线程为根蒂根基的调剂单位。
4. 线程的上风
- 可以阐扬多处理惩罚器的强大才能:多线程法度可以经由过程进步处理惩罚器资料哄骗率来提拔体系吞吐率。
- 建模的简单性:比如在编写Servlet中,不须要懂得有几许恳求在同一时刻要被处理惩罚,套接字的输入输出流是否被梗阻等题目。
- 异步事务的简化处理惩罚:比如可以哄骗多线程把错杂的非梗阻I/O,改变为同步I/O,即每个恳求都拥有本身的处理惩罚线程。
- 响应更活络的用户界面:在AWT和Swing等对象中,采取一个事务分发线程来调换主事务轮回。
5.线程带来的风险
- 安然性题目:比如竞态前提。
- 活泼性题目:比如死锁,饥饿,活锁。
- 机能题目:线程调剂是个极大开销的操纵;多个线程共享数据时,必须应用同步机制,而这些机制往往会按捺某些编译器的优化。
6.解决多个线程接见一个可变的状况变量导致呈现错误的三种体式格式
- 不在线程之间共享该状况变量
- 将状况变量批改为不成变的变量
- 在接见状况变量时应用同步
7.线程安然性
当多个线程接见某个类时,不管运行景象采取何种调剂体式格式或者这些线程将如何瓜代履行,并且在主调代码中不须要任何额外的同步或协同,这个类都能发挥解析出正确的行动,那么就称这个类是线程安然的。 此中正确性的含义是,某个类的行动与其规范完全一致。在杰出的规范中凡是会定义各类不变性前提来束缚对象的状况,以及定义各类后验前提来描述对象操纵的成果。
8.竞态前提
当某个策画的正确性取决于多个线程的瓜代履行时序时,那么就会产生竞态前提。
“先搜检后履行”是一种常见的竞态前提,它的本质是基于一种可能失效的调查成果来做出断定或者履行某个策画。下面的代码LazyInitRace中就包含一个竞态前提,它可能会破损这个类的正确性。
public class LazyInitRace {
private ExpensiveObject instance = null;
public ExpensiveObject getInstance() {
if (instance == null) {
instance = new ExpensiveObject();
}
return instance;
}
}
9.内置锁
java供给了一种内置的锁机制来支撑原子性:同步代码块。它包含两项目组:一个作为锁的对象引用,一个作为由这个锁保护的代码块。每个Java对象都可以用做一个实现同步的锁,这些锁被称为内置锁或把守锁。线程在进入同步代码块之前会主动获得锁,并且在退出同步代码块时主动开释锁,而无论是经由过程正常的把握路径退出,还是经由过程从代码块中抛出异常退出。获得内置锁的独一路子就是进入由这个锁保护的同步代码块或办法。
- java的内置锁是互斥锁:这意味着最多只有一个线程能持有这种锁。
- java的内置锁是可以重入的:即某个线程试图获得一个已经过它本身持有的锁,那么这个恳求就会成功。
我所有的自负皆来自我的自卑,所有的英雄气概都来自于我的软弱。嘴里振振有词是因为心里满是怀疑,深情是因为痛恨自己无情。这世界没有一件事情是虚空而生的,站在光里,背后就会有阴影,这深夜里一片寂静,是因为你还没有听见声音。—— 马良《坦白书》
1. 促进过程和线程呈现的原因,是要解决以下题目:
- 资料哄骗率
- 公允性
- 便利性
2. 过程: 操纵体系为各个自力履行的过程分派各类资料,包含内存,文件句柄以及安然等。过程之间可以经由过程一些粗粒度的通信机制来互换数据,包含:套接字,旌旗灯号处理惩罚器,共享内 存,旌旗灯号量以及文件等。
3. 线程:线程容许在同一个过程中同时存在多个法度把握流。线程会共享过程局限内的资料,例如内存句柄和文件句柄,但每个线程都有各自的法度计数器,栈以及局部变量等。线程也被称为 轻量级的过程,在大多半现代操纵体系中,都是以线程为根蒂根基的调剂单位。
4. 线程的上风
- 可以阐扬多处理惩罚器的强大才能:多线程法度可以经由过程进步处理惩罚器资料哄骗率来提拔体系吞吐率。
- 建模的简单性:比如在编写Servlet中,不须要懂得有几许恳求在同一时刻要被处理惩罚,套接字的输入输出流是否被梗阻等题目。
- 异步事务的简化处理惩罚:比如可以哄骗多线程把错杂的非梗阻I/O,改变为同步I/O,即每个恳求都拥有本身的处理惩罚线程。
- 响应更活络的用户界面:在AWT和Swing等对象中,采取一个事务分发线程来调换主事务轮回。
5.线程带来的风险
- 安然性题目:比如竞态前提。
- 活泼性题目:比如死锁,饥饿,活锁。
- 机能题目:线程调剂是个极大开销的操纵;多个线程共享数据时,必须应用同步机制,而这些机制往往会按捺某些编译器的优化。
6.解决多个线程接见一个可变的状况变量导致呈现错误的三种体式格式
- 不在线程之间共享该状况变量
- 将状况变量批改为不成变的变量
- 在接见状况变量时应用同步
7.线程安然性
当多个线程接见某个类时,不管运行景象采取何种调剂体式格式或者这些线程将如何瓜代履行,并且在主调代码中不须要任何额外的同步或协同,这个类都能发挥解析出正确的行动,那么就称这个类是线程安然的。 此中正确性的含义是,某个类的行动与其规范完全一致。在杰出的规范中凡是会定义各类不变性前提来束缚对象的状况,以及定义各类后验前提来描述对象操纵的成果。
8.竞态前提
当某个策画的正确性取决于多个线程的瓜代履行时序时,那么就会产生竞态前提。
“先搜检后履行”是一种常见的竞态前提,它的本质是基于一种可能失效的调查成果来做出断定或者履行某个策画。下面的代码LazyInitRace中就包含一个竞态前提,它可能会破损这个类的正确性。
public class LazyInitRace {
private ExpensiveObject instance = null;
public ExpensiveObject getInstance() {
if (instance == null) {
instance = new ExpensiveObject();
}
return instance;
}
}
9.内置锁
java供给了一种内置的锁机制来支撑原子性:同步代码块。它包含两项目组:一个作为锁的对象引用,一个作为由这个锁保护的代码块。每个Java对象都可以用做一个实现同步的锁,这些锁被称为内置锁或把守锁。线程在进入同步代码块之前会主动获得锁,并且在退出同步代码块时主动开释锁,而无论是经由过程正常的把握路径退出,还是经由过程从代码块中抛出异常退出。获得内置锁的独一路子就是进入由这个锁保护的同步代码块或办法。
- java的内置锁是互斥锁:这意味着最多只有一个线程能持有这种锁。
- java的内置锁是可以重入的:即某个线程试图获得一个已经过它本身持有的锁,那么这个恳求就会成功。