本文首发自「慕课网」(www.imooc.com),想了解更多IT干货内容,程序员圈内热闻,欢迎关注"慕课网"或慕课网公众号!
作者:王军伟Tech | 慕课网讲师
1. 前言
今天我们要用最简洁,清晰的内容对高并发之魂 synchronized 关键字的使用进行讲解,帮助你更快搞定synchronized。本文具体内容包含如下:
- 了解 synchronized 关键字的概念,从总体层面对 synchronized 关键字进行了解,是我们本节课程的基础知识;
- 了解 synchronized 关键字的作用,知道 synchronized 关键字使用的意义,使我们学习本节内容的出发点;
- 掌握 synchronized 关键字的 3 中使用方式,使我们本节课程的核心内容,所有的内容讲解都是围绕这一知识点进行的;
- 了解 synchronized 关键字的内存语义,将 synchronized 关键字与 Java 的线程内存模型进行关联,更好的了解 synchronized 关键字的作用及意义,为本节重点内容。
2. synchronized 关键字介绍
概念:synchronized 同步块是 Java 提供的一种原子性内置锁,Java 中的每个对象都可以把它当作一个同步锁来使用,这些 Java 内置的使用者看不到的锁被称为内部锁,也叫作监视器锁。
线程的执行:代码在进入 synchronized 代码块前会自动获取内部锁,这时候其他线程访问该同步代码块时会被阻塞挂起。拿到内部锁的线程会在正常退出同步代码块或者抛出异常后或者在同步块内调用了该内置锁资源的 wait 系列方法时释放该内置锁。
内置锁:即排它锁,也就是当一个线程获取这个锁后,其他线程必须等待该线程释放锁后才能获取该锁。
Tips:由于 Java 中的线程是与操作系统的原生线程一一对应的,所以当阻塞一个线程时,需要从用户态切换到内核态执行阻塞操作,这是很耗时的操作,而 synchronized 的使用就会导致上下文切换。
后续章节我们会引入 Lock 接口和 ReadWriteLock 接口,能在一定场景下很好地避免 synchronized 关键字导致的上下文切换问题。
3. synchronized 关键字的作用
作用:在并发编程中存在线程安全问题,使用 synchronized 关键字能够有效的避免多线程环境下的线程安全问题,线程安全问题主要考虑以下三点:
- 存在共享数据,共享数据是对多线程可见的,所有的线程都有权限对共享数据进行操作;
- 多线程共同操作共享数据。关键字 sync