synchronized 是 Java 中的一个关键字,用于实现线程之间的同步,主要有以下作用:
- 线程安全:
synchronized可以确保多个线程在访问共享资源时,同一时刻只有一个线程执行同步代码块或同步方法,从而避免了多个线程同时对同一资源进行修改而导致数据不一致或其他并发问题。 - 保证可见性:当一个线程执行了同步代码块或同步方法中的代码时,它会将本地内存中的共享变量值刷新到主内存中,从而使其他线程能够看到该变量最新的值。
- 防止指令重排:
synchronized还可以防止指令重排的优化,确保在同步代码块中的操作按照代码的顺序执行,避免出现意外的结果。 - 锁重入:同一个线程可以多次获取同一个锁,这就是锁重入的机制。如果不支持锁重入,那么在同一个线程中对同一个锁的多次请求会导致线程死锁。
需要注意的是,synchronized 的使用可能会导致性能问题,因为每次进入同步代码块或同步方法都需要进行加锁和解锁的操作。为了避免性能问题,可以使用基于 CAS(比较-交换)的非阻塞算法来实现并发控制。另外,在 Java 5 中,还引入了 java.util.concurrent 并发包,提供了一些更高效的并发控制机制,例如 ReentrantLock、Semaphore 等。