5.3.6 多线程同步

5.3.6 多线程同步

Java为多线程编程提供了内置的支持。多线程方式通常可以通过Thread()类和Runnable接口实现。第2章中介绍了进程的状态变化,同样地,线程也有新建、就绪、运行、阻塞和终止状态。使用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新建状态。它保持这个状态直到对象调用start()方法,该线程就进入就绪状态,等待CPU调度。如果就绪状态的线程取得CPU资源,就可以执行run()方法,此时线程便处于运行状态。当线程需要等待外部事件时,执行sleep(睡眠)、suspend(挂起)等方法进入阻塞状态。阻塞状态分为以下3种。

①等待阻塞:运行状态中的线程调用wait()方法,就进入等待阻塞状态,等待某个工作完成。

②同步阻塞:线程在获取synchronized同步锁失败时进入同步阻塞。

当多线程需要通信或共享数据时,需要同步机制使它们能协调一致保证程序正确执行。基于此,Java使用了监视器(Monitor)的机制实现线程间的同步。可以将监视器视为一个封闭的盒子,一旦一个线程进入盒子,其他线程将无法进入直到该线程退出。这样多线程可以实现互斥地访问共享资源。通常可以用synchronized关键字修饰方法或代码块,让对象获得同步锁,这相当于定义监视器。当一个线程访问某对象的synchronized方法或代码块时,其他线程对这个synchronized方法或代码块的访问将会被阻塞。

③其他阻塞:通过调用线程的sleep()或join()发出了I/O请求时,线程就会进入阻塞状态。

一个运行状态的线程完成任务或者其他终止条件发生时,该线程就进入终止状态,结束其生命周期。

Java提供了Thread类、Object类,synchronized关键字,Runnable、Callable等接口,定义了一系列线程的操作控制方法。利用相应的API,可以快速地编写出多线程的程序。