从Java 5.0开始,Java提供了访问共享对象的新机制:ReentrantLock。它实现了Lock接口:
public interface Lock {
void lock();
void lockInterruptibly() throws InterrupttedException;
boolean tryLock();
boolean tryLock(long timeout, TimeUnitunit) throws InterruptedException;
void unlock();
Condition newCondition();
}
ReentrantLock提供了与synchronized相同的互斥和内存可见性的保证。获得ReentrantLock的锁与进入synchronized块有着相同的内存语义,释放ReentrantLock锁与退出synchronized块有相同的内存语义。
那么为什么要创建与内存锁如此相似的机制呢?内存锁在大部分情况下能够很好的工作,但是有些功能上存在着局限:
1)不能中断那些正在等待获取锁的进程,并且在请求锁失败的情况下,必须无限等待;
2)内部锁必须在获取它们的代码块中被释放;这很好的简化了代码,但是在某些情况下,一个更灵活的加锁机制提供了更好的活跃度和性能。
使用ReentrantLock的一般形式为:
Lock lock = new ReentrantLock();
........
lock.lock();
try {
//更新对象的状态
//捕获异常,必要时恢复到原来的不变约束
} finally {
lock.unlock(); //锁必须在finally块中释放
}
《Java并发编程实践》一书给出了使用ReentrantLock的最佳时机:
当你需要以下高级特性时,才应该使用:可定时的、可轮询的与可中断的锁获取操作,公平队列,或者非块结构的锁。否则,请使用synchronized。
http://aguang520.iteye.com/blog/755017
分享到:
相关推荐
Java 中的 Lock 和 Synchronized 的区别 Java 语言中有很多相似关键字或相似意义的字,...lock 提供了更加灵活和高效的锁机制,可以满足不同场景下的需求,而 synchronized 则是 Java 中的关键字,具有语言的内置性。
- 考虑使用更细粒度的锁,比如`ReentrantLock`等。 - 避免在循环体内部使用`synchronized`,因为这会降低程序的响应能力和吞吐量。 #### 8. 尽量使用StringBuilder和StringBuffer进行字符串连接 在拼接字符串时,...
Java是一种广泛使用的面向对象的编程语言,其设计目标包括简洁性、可移植性和安全性。以下是一些关于Java面试题的详细知识点: 1. 异常处理机制:Java的异常处理机制是通过`try-catch-finally`语句块实现的。当程序...
- **类的初始化时机**:Java虚拟机在首次主动使用类时进行初始化。 ### 3. Java面试相关 #### 3.1 常见面试题 - **变量自增运算**:考察对Java中变量自增运算的理解,如`i++`与`++i`的区别,以及执行顺序和结果。...
在Java编程语言中,多线程是并发执行多个任务的核心机制。这个压缩包中的文件提供了几个关于Java多线程交互的实例,可以帮助我们深入理解如何在并发环境中控制线程的同步,确保数据的一致性和安全性。 首先,让我们...
在Java中,可以通过关键字synchronized和java.util.concurrent包中的工具类如ReentrantLock来实现线程同步。Java的多线程并发模型基于线程和锁的机制,以及引入了volatile关键字、CAS操作(Compare-And-Swap)、原子...
可以通过合理使用锁(如ReentrantLock)来提升性能。 - **Lock接口**:提供了比synchronized更灵活的锁机制,如公平锁、非公平锁、读写锁等,可以控制锁的获取和释放时机,以优化并发性能。 - **volatile关键字**...
Java是一种广泛使用的面向对象的编程语言,以其跨平台、高性能、丰富的类库和高效能而闻名。在Java面试中,面试官通常会考察应聘者的基础知识、编程能力、问题解决技巧以及对Java特性的理解。以下是一些可能在Java...
Java提供了多种线程同步机制,包括synchronized关键字、wait()、notify()和notifyAll()方法,以及Lock接口和相关的类如ReentrantLock。synchronized确保同一时刻只有一个线程访问特定代码块。wait()、notify()和...
Java面试大全涵盖了许多核心知识点,...这些是Java面试中常见的问题,理解并掌握这些知识点对于Java开发者来说至关重要。在面试时,除了理论知识,还要关注实际应用和问题解决能力,这样才能全面展示自己的专业水平。
Spring框架是Java编程中广泛使用的一个框架,它主要通过依赖注入(DI)和面向切面编程(AOP)来简化Java开发。 #### Spring框架中用到的设计模式 Spring框架使用了多种设计模式,包括工厂模式、单例模式、代理模式...
Java是一种广泛使用的面向对象的编程语言,以其跨平台、高性能和丰富的类库而备受开发者喜爱。在面试过程中,Java相关的知识通常涵盖了语法基础、面向对象编程、数据结构与算法、多线程、JVM内存模型、集合框架、...
因此,`OptLog.java`可能包含了优化的日志同步策略,比如使用`ReentrantLock`,这是一种更细粒度的锁,允许更高的并发性: ```java import java.util.concurrent.locks.ReentrantLock; public class OptLog { ...
2. **时机**:在Java中,一个对象如果变得不可达(即没有任何引用指向它),那么它就会成为垃圾收集的目标。Java虚拟机(JVM)会在适当的时候执行垃圾回收操作,清理这些无用的对象。 #### 三、多线程中的同步 1. ...
10. **使用适当的同步机制**:避免使用synchronized关键字的全局锁,可以考虑使用ReentrantLock、ConcurrentHashMap等并发容器,以减少锁竞争。 11. **使用流式API (Stream API)**:Java 8引入的流API可以简化处理...
4. 线程同步:Java提供了多种线程同步机制,如synchronized关键字、wait()、notify()和notifyAll()方法,以及Lock接口(如ReentrantLock)等。这些方法用于协调多线程对共享资源的访问,防止数据不一致。 5. 析构...
此外,Java提供了丰富的并发工具,如`ExecutorService`、`Semaphore`、`ReentrantLock`等,用于协调和控制线程间的交互。 #### 结论 Java作为一门强大的编程语言,其基础知识涵盖了从环境配置、语言特性、数据类型...
### Java基础知识点详解 #### 1. 多个类在一个.java文件中 - **规则**:在一个`.java`源文件中可以定义多个类,但只能有一个公共类,并且该文件名必须与公共... - 使用`ReentrantLock`等锁。 #### 51. 启动线程 -...