文章目录
- synchronized 关键字介绍
- synchronized 的内存语义
synchronized 关键字介绍
synchronized 块是 Java 提供的一种原子性 内 置锁, Java 中的每个对象都可以把它当作一个 同步锁来使用 , 这些 Java 内置的使用者看不到的锁被称为内部锁 ,也 叫作监视器锁。线程的执行代码在进入 synchronized 代码块前会自动获取内部锁,这时候其他线程访 问 该同步代码块时会被阻塞挂起。拿到内部锁的线程会在正常退出同步代码块或者抛出 异常后或者在 同步块 内 调用了该 内置锁资源的 wait 系列方法时释放该 内置锁 。 内置锁是排它锁 ,也就是当一个线程获取这个锁后 , 其他线程必须等待该线程释放锁后才能获取该锁 。
另外,由于 Java 中的线程是与操作系统的原生线程一一对应的,所以当阻塞一个线
程时伞,需要从用户态切换到内核态执行阻塞操作,这是很耗时的操作,而synchronized 的使用就会导致上下文切换。
synchronized 的内存语义
共享变量 内存可见性问题主要是由于线程的工作内存导致的,下面我们来讲解 synchronized 的一个内存语义,这个内存语义就可以解决共享变量内存可见性问题 。进入 synchronized 块的内存语义是把在 synchronized 块内使用到的变量从线程的工作内存中清除,这样在 synchronized 块内使用到该变量时就不会从线程的工作内存中获取,而是直接从主内存中获取 。 退出 synchronized 块的内存语义是把在 synchronized 块内对共享变量的修改刷新到主内存 。
其实这也是加锁和释放锁的语义,当获取锁后会清空锁块内本地内存中将会被用到的共享变量,在使用这些共享变量时从主 内 存进行加载,在释放锁时将本地内存中修改的共享变量刷新到主内存 。
除可以解决共享变量 内存可见性问题外, synchronized 经常被用来实现原子性操作 。
另外请注意, synchronized 关键字会引起线程上下文切换并带来线程调度开销 。