synchronized
是 Java 中用于实现线程同步的关键字。它可以被应用于代码块或方法上,用于对某个对象或类进行加锁。
在底层实现上,synchronized
的主要原理是基于对象的监视器(monitor)和内置锁(intrinsic lock)。每个对象都有一个与之关联的监视器,也称为锁。当一个线程进入 synchronized
修饰的代码块或方法时,它首先要尝试获取该对象的锁,如果该锁没有被其他线程占用,则当前线程会获得锁并顺利执行,锁会被标记为被当前线程占用;否则,当前线程就会阻塞等待,直到获取到锁才能执行。当线程执行完 synchronized
代码块或方法后,会释放锁,让其他线程有机会获取该锁。
在 Java 虚拟机的内存模型中,synchronized
关键字还具有隐式的内存语义,确保线程在获取锁之前读取到最新的共享变量值,并在释放锁时将修改后的共享变量值刷新回主内存,以保证多线程间共享变量的可见性和一致性。
总结来说,synchronized
关键字的底层实现使用了对象的监视器和内置锁,通过获取和释放锁来实现线程的同步。它提供了简单而有效的线程安全机制,但在一些复杂的场景下可能会存在性能问题。为了更好地满足并发需求,Java 5 引入了更灵活的锁机制,如 Lock
接口及其实现类 ReentrantLock
,可以更精确地控制锁的获取和释放。