概述
Java 语言中主要的同步手段就是 synchronized 关键字,它强制实行互斥,确保执行 synchronized 块的线程的动作,能够被后来执行受相同锁保护的 synchronized 块的其他线程看到。
在使用得当的时候,内在锁可以让程序做到线程安全,但是在使用锁定保护短的代码路径,而且线程频繁地争用锁的时候,锁定可能成为相当繁重的操作。参考学习
内在锁synchronized关键字的实现依赖于JVM,因此在这个关键字作用的对象的作用范围内都是同一时刻只能有一个线程进行操作。
它是一种同步锁,作用对象有四种:
- 修饰代码块:指用大括号括起来的代码,被称为“同步代码块”,作用于调用该代码块的对象。
- 修饰方法:指整个方法,被称为同步方法,作用于调用该方法的对象。
- 修饰静态方法:指整个静态方法,由于静态方法可以被理解为类级别的对象,因此它作用于该类的所有的对象。
- 修饰类:指整个类,作用于该类的所有的对象。
引申拓展:另一种锁Lock
JDK提供的基于源码的锁,依赖于特殊的CPU指令、代码实现。其代表为ReentrantLock.
后续将会单独做一篇手记。
线程安全中原子性方式的简单对比
- synchronized:是不可中断锁,适合竞争不激烈的场景,其可读性较好。
- Lock:可通过unlock进行锁的中断,在竞争激烈时仍可以保持常态,同步多样化。
- Atomic包:竞争激烈时也可以保持常态,性能比Lock好,但缺点是只能通过CAS同步一个值。