Java Thread API

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.性能
吞吐量:单位时间完成的处理数量
响应性:从发出请求到收到响应的时间

猜你喜欢

转载自blog.csdn.net/qq_21508059/article/details/78867425