当前位置:嗨网首页>书籍在线阅读

07-其他说明

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

其他说明

在程序中使用 synchronized 关键词可能会削弱应用的性能,所以只有在并发环境中,才有必要使用该关键词来确保对共享数据的访问。如果当前有多个线程访问 synchronized 方法,则只有一个线程可以正常执行而其他线程需要等待。如果一个操作没有使用 synchronized 关键词进行保护,则所有线程都能同时执行,这样也可以减少程序的执行时间。如果开发者已经确信一个方法不会同时由多个线程访问,那么无须用 synchronized 关键词对结果进行修饰。无论如何,如果一个类是设计给多线程访问的,那么应当考虑程序运行结果的正确性。开发者需要明白,程序能否正确执行,比程序性能是否良好更加重要,因此需要在项目文档中详细描述方法和类在线程安全方面的情形。

当然,可以在一个线程中递归地访问 synchronized 方法。当线程访问一个由 synchronized 关键词保护的方法时,该线程仍然可以继续访问在同一个对象实例上由 synchronized 关键词保护的其他方法(包含线程当前正在访问的方法),而无须重新申请访问这类 synchronized 的权限。

使用 synchronized 关键词只保护一段代码块而非整个方法。也就是说,为了获得更高的访问效率,通过 synchronized 关键词只保护访问共享数据的代码块,而非其他没有访问共享数据的代码,从而保证临界区代码(同时只能有一个线程访问的一段代码)的足够精简,同样也需要避免在临界区代码中执行阻塞性的操作(如I/O操作)。比如通过 synchronized 关键词保护对大楼中现存人数的修改,并移出代码块中耗时较长却不访问共享数据的操作。因此,当开发者尝试往程序添加 synchronized 关键词时需要传入参数到 synchronized 中。此时只有一个线程能够访问参数为同一个对象实例 synchronized 的代码(代码块或者方法)。通常由 this 对象保护这些方法:

synchronized (this) {
  // Java code
}