Java Thread API
线程安全问题
《Java并发编程实战》中,对线程安全问题的描述为:当多个线程同时访问共享状态时,共享状态的不一致问题。
简单地讲,就是多个线程同时访问某个共享对象时,如果导致该对象状态不一致,就出现了线程安全问题。
多个线程并发访问某个共享对象,这种情况称为竞态条件(race condition)
线程互斥
通过synchronized关键字修饰方法或代码块,每个线程需要持有对象锁,才能运行该代码片段。
public synchronized void method1() {
//同步方法
}
public void method2() {
synchronized(this) {
//同步代码块
}
}
对象锁也叫监视器(monitor),锁是针对对象的,两个对象的同步方法可以并发执行。Java中每个对象都可以作为锁对象使用。
public synchronized void method1() {
//同步方法
}
//obj1和obj2提供了各自的对象锁
obj1.method1();
obj2.mothod1();
线程协作
Object对象提供了如下方法:
void wait()
void notify()
void notifyAll()
上述方法执行的前提是,当前线程获取了对象锁。
1.wait
当执行wait方法,当前线程会进入锁对象的线程等待队列,然后释放锁。
2.notify
当执行notify方法,会从该对象的线程等待队列中,选择一个等待的线程移出等待队列。
注意:执行完notify方法,当前线程不会释放锁,直到synchronized代码块运行结束,才会释放锁。
notifyAll
当执行notifyAll方法,会将该对象的线程等待队列中的所有线程移除等待队列。
和notify方法一样,该方法执行后不会立刻释放锁。
多线程程序评价标准
1.安全性
不损坏对象,使对象的状态保持一致性
2.生存性
必要的处理一定能够被执行
3.可复用性
类能够重复利用。类可以作为组件,从软件中抽离出来。
这就要求架构设计的低耦合性、高可扩展性。
对于并发类,还要求将线程的互斥机制和方针隐藏到类中。
4.性能
吞吐量:单位时间完成的处理数量
响应性:从发出请求到收到响应的时间