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

02-简介

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

2.1 简介

并发编程中最常见的情景之一就是多个执行线程共享相同资源。这体现在同一个程序中多个线程参与读或者写相同的数据,或者访问相同的文件或数据库链接。但是随着资源的共享,会带来一些错误和数据不一致,这时需要开发者设法通过一些机制来避免错误的发生。上文描述的线程间共享资源的情形称作竞态条件。当一段程序中存在多个线程同时访问同一个共享资源时,竞态条件随之产生。因此线程的执行顺序将决定程序执行的最终结果,在大多数情况下,结果都是不正确的。开发者可能还会遇到可见性的问题,也就是说,当一个线程尝试修改一个共享变量的值时,由于该线程对这个共享变量的修改可能仅在当前工作线程内部的缓存中生效,因此其他工作线程无法获知当前工作线程对这一共享变量值的修改(或者说其他线程读取到的是一个历史数据)。

为了解决这些的问题,我们引入了临界区(critical section)这个关键概念。临界区是一个用于访问共享资源的代码块,并且在同一时刻只能由一个线程执行。

为了帮助程序员实现临界区代码,Java语言(或者说市面上大部分的编程语言)提供了一些控制线程同步访问的机制。当一个线程访问临界区时,它可以利用同步机制确定是否有其他线程在执行临界区,如果当前无其他线程访问临界区,那么该线程将进入临界区;如果存在其他线程访问临界区,那么在其他线程退出临界区之前该线程都将挂起等待。当占用临界区的线程退出访问后,如果此时在临界区代码外有多个线程同时在等待,那么JVM将会选择其中一个线程来接替该临界区的代码执行,其余的则继续等待。本章将讲解如何使用Java语言提供的两种基本同步机制:

  • 关键词 synchronized
  • Lock 接口及其实现类