Java多线程面试焦点:synchronized与volatile解析

版权申诉
0 下载量 100 浏览量 更新于2024-08-08 收藏 187KB DOCX 举报
"多线程面试必问源码知识点" 在Java多线程编程中,`synchronized`关键字扮演着至关重要的角色,它用于确保共享资源在同一时刻只被一个线程访问,从而避免并发问题,如数据不一致性和竞态条件。`synchronized`通过锁定对象来实现线程同步,确保在多线程环境中对共享资源的访问是安全的。 1. **synchronized的使用方式** - **同步代码块**:synchronized关键字可以用来包围一段代码,形成同步代码块。在这个例子中,`synchronized(o)`锁定的是对象`o`,任何时刻只有一个线程能够执行这个代码块,其他线程必须等待获取锁之后才能继续执行。 ```java public class ThreadTest { private int count = 10; Object o = new Object(); private void m1() { synchronized (o) { count--; System.out.println(Thread.currentThread().getId() + ":count=" + count); } } } ``` - **同步方法**:synchronized还可以修饰方法,这意味着整个方法体都会被锁定。这与同步代码块锁定`this`对象的效果相同。 ```java private synchronized void m1() { count--; System.out.println(Thread.currentThread().getId() + ":count=" + count); } ``` 2. **同步的原理** - **监视器锁(Monitor)**:每个对象都有一个内置的监视器锁,当一个线程进入同步代码块或同步方法时,会自动获取该锁,其他线程试图获取同一锁时会被阻塞,直到锁被释放。 3. **锁的概念** - **可重入性**:Java的synchronized是可重入的,意味着一个线程如果已经持有对象的锁,它可以再次请求该锁,不会造成死锁。 - **锁的粒度**:synchronized的锁粒度可以是整个方法或者代码块,这取决于它的使用方式。 4. **同步的优缺点** - **优点**:保证了线程安全,避免数据不一致性。 - **缺点**:性能开销大,因为会阻塞线程,可能导致程序执行效率下降。 5. ** volatile 的对比** - `volatile`关键字也可以用于处理多线程环境中的共享变量,但它并不提供锁机制,而是保证了变量的可见性和有序性,但无法防止多个线程同时修改共享变量,因此在某些情况下,volatile可能不足以解决并发问题。 6. **替代方案** - Java 5 引入的`java.util.concurrent`包提供了更高级的并发工具,如`ReentrantLock`(可重入锁)、`Semaphore`(信号量)和`Atomic`类等,它们提供了比`synchronized`更灵活和高效的同步机制。 `synchronized`是Java多线程编程中的基础工具,理解其工作原理和使用场景对于编写健壮的并发程序至关重要。然而,过度依赖synchronized可能会导致性能问题,因此在实际开发中需要根据具体需求选择合适的同步策略。