在Java中,synchronized
关键字是一种同步锁机制,用于确保多个线程在访问共享资源时能够保持线程安全。线程安全是指在多线程环境下,当多个线程尝试同时访问共享资源时,任何时刻最多只有一个线程能够执行特定的代码段。
synchronized
关键字可以用于以下几个方面:
-
方法同步:
当synchronized
关键字用于方法声明时,整个方法体都是同步的。这意味着同一时间只能有一个线程执行该方法。public synchronized void myMethod() { // 方法体 }
-
代码块同步:
synchronized
关键字也可以用于特定的代码块,只有被括起来的代码块是同步的。public void myMethod() { synchronized (this) { // 被括起来的代码块 } }
在代码块中,
synchronized
后面跟着的括号内是一个锁对象,通常是当前实例对象this
,但也可以是任何其他对象。 -
静态方法同步:
当synchronized
关键字用于静态方法时,它锁定的是当前类的Class
对象。public synchronized static void myStaticMethod() { // 方法体 }
synchronized
关键字保证线程安全的方式:
-
互斥(Mutex):当一个线程开始执行一个同步方法或进入一个同步代码块时,它会获得一个锁。这个锁确保了在同一时间只有一个线程可以执行该方法或代码块。其他线程必须等待直到锁被释放。
-
内存可见性:
synchronized
还确保了线程之间的内存可见性。当一个线程修改了共享资源并释放了锁,其他线程在获取到锁之后,能够看到修改后的最新值。 -
原子性:在同步代码块或方法中执行的操作是原子性的,即这些操作要么全部执行,要么全部不执行,中间不会有其他线程的干扰。
虽然synchronized
关键字可以保证线程安全,但它也有缺点,如可能导致性能瓶颈和死锁。因此,在某些情况下,开发者可能会选择其他并发控制工具,如java.util.concurrent
包中的锁(如ReentrantLock
)。
Lock lock = new ReentrantLock();
lock.lock();
try {
// 线程安全的操作
} finally {
lock.unlock();
}
这些锁提供了更灵活的锁机制,允许更细粒度的控制,例如尝试获取锁、超时等待、公平性等。
标签:面试题,同步,Java,synchronized,lock,代码,关键字,线程 From: https://blog.csdn.net/bifengmiaozhuan/article/details/138707348