07-其他说明
其他说明
在程序中使用 synchronized
关键词可能会削弱应用的性能,所以只有在并发环境中,才有必要使用该关键词来确保对共享数据的访问。如果当前有多个线程访问 synchronized
方法,则只有一个线程可以正常执行而其他线程需要等待。如果一个操作没有使用 synchronized
关键词进行保护,则所有线程都能同时执行,这样也可以减少程序的执行时间。如果开发者已经确信一个方法不会同时由多个线程访问,那么无须用 synchronized
关键词对结果进行修饰。无论如何,如果一个类是设计给多线程访问的,那么应当考虑程序运行结果的正确性。开发者需要明白,程序能否正确执行,比程序性能是否良好更加重要,因此需要在项目文档中详细描述方法和类在线程安全方面的情形。
当然,可以在一个线程中递归地访问 synchronized
方法。当线程访问一个由 synchronized
关键词保护的方法时,该线程仍然可以继续访问在同一个对象实例上由 synchronized
关键词保护的其他方法(包含线程当前正在访问的方法),而无须重新申请访问这类 synchronized
的权限。
使用 synchronized
关键词只保护一段代码块而非整个方法。也就是说,为了获得更高的访问效率,通过 synchronized
关键词只保护访问共享数据的代码块,而非其他没有访问共享数据的代码,从而保证临界区代码(同时只能有一个线程访问的一段代码)的足够精简,同样也需要避免在临界区代码中执行阻塞性的操作(如I/O操作)。比如通过 synchronized
关键词保护对大楼中现存人数的修改,并移出代码块中耗时较长却不访问共享数据的操作。因此,当开发者尝试往程序添加 synchronized
关键词时需要传入参数到 synchronized
中。此时只有一个线程能够访问参数为同一个对象实例 synchronized
的代码(代码块或者方法)。通常由 this
对象保护这些方法:
synchronized (this) {
// Java code
}