Java并发深入:Synchronized与ReentrantLock详解与应用

1 下载量 24 浏览量 更新于2024-08-29 收藏 77KB PDF 举报
Java并发学习笔记(二)主要探讨了Synchronized关键字在Java并发编程中的应用,这是Java中实现线程同步的重要机制。Synchronized关键字确保了在多线程环境下的代码块或方法操作具有原子性、可见性和有序性。 1. **原子性**:通过synchronized,当一个线程进入被锁定的代码块或方法时,其他线程必须等待,直到当前线程执行完并释放锁。这防止了并发修改数据时可能出现的中间状态,确保了操作的完整性。 2. **可见性**:当一个线程修改了共享变量后,通过synchronized的同步,其他线程在获取锁后能看到这个修改。这样,多个线程之间的数据一致性得以保持。 3. **有序性**:synchronized能避免JVM的指令重排序优化带来的问题,确保了线程间的程序顺序执行,即使在多核处理器上也是如此。 4. **注意事项**: - 锁的粒度:默认情况下,synchronized修饰的方法锁的对象是当前实例(this),而同步代码块可以指定锁对象。对象锁是基于实例的,因此不同实例间的同步互不影响。 - 可重入性:如果一个线程已经获得了某个对象的锁,再次尝试获取该对象的锁时不会阻塞,但只限于同一个线程。 - 锁的释放:无论方法正常结束还是抛出异常,synchronized关键字都会自动释放锁,确保资源管理的一致性。 此外,学习笔记还提到了ReentrantLock同步锁,这是一种更灵活的锁机制,它提供了可中断、公平/非公平模式以及条件变量等功能,适用于线程竞争更为复杂的情况。ReentrantLock允许线程更精细地控制锁的获取和释放,适合处理高并发场景,并且可以替代synchronized在某些特定需求下使用。 总结来说,这篇笔记重点讲解了Java中synchronized关键字的基础原理和使用技巧,以及其与ReentrantLock的区别,帮助读者更好地理解和应对并发编程中的同步问题。