在JDK1.5之前,多线程并发一般用synchronized关键字来实现。1.5之后,在java.util.concurrent包提供了更强大的支持。
synchronized 方法或语句的使用提供了对与每个对象相关的隐式监视器锁定的访问,但却强制所有锁定获取和释放均要出现在一个块结构中:
当获取了多个锁定时,它们必须以相反的顺序释放,且必须在与所有锁定被获取时相同的词法范围内释放所有锁定。
Lock 接口的实现允许锁定在不同的作用范围内获取和释放,并允许以任何顺序获取和释放多个锁定,从而支持使用这种技术。
随着灵活性的增加,也带来了更多的责任。锁定和取消锁定出现在不同作用范围中时,必须谨慎地确保保持锁定时所执行的所有代码用 try-finally 或 try-catch 加以保护,以确保在必要时释放锁定。
Lock interface
三种形式的锁定获取(可中断、不可中断和定时)在其性能特征、排序保证或其他实现质量上可能会有所不同。
一个非块结构的获取锁定尝试 (tryLock())、
一个获取可中断锁定的尝试 (lockInterruptibly())
一个获取超时失效锁定的尝试 (tryLock(long, TimeUnit))
void lock() 如果无法获取锁,线程休眠
void lockInterruptibly() throws InterruptedException, 如果无法获取锁,线程休眠,但同时可以被中断
boolean tryLock() 无论是否能获得锁,都立即返回,只是返回值不同。只有返回true的情况下才在try-finally的finally中unlock()锁,否则不必要
boolean tryLock(long, TimeUnit) throws InterruptedException, 与tryLock()的区别是如果不能立即获取锁,可以等待一段时间进行休眠,在此期间可以被中断。
void unlock() 释放锁
Condition newCondition() 返回绑定到此 Lock 实例的新 Condition 实例。
Before waiting on the condition the lock must be held by the current thread. A call to Condition.await() will atomically release the lock before waiting and re-acquire the lock before the wait returns.
可以用来实现信号量:
class BoundedBuffer {
final Lock lock = new ReentrantLock();
final Condition notFull = lock.newCondition();
final Condition notEmpty = lock.newCondition();
final Object[] items = new Object[100];
int putptr, takeptr, count;
public void put(Object x) throws InterruptedException {
lock.lock();
try {
while (count == items.length)
notFull.await();
items[putptr] = x;
if (++putptr == items.length) putptr = 0;
++count;
notEmpty.signal();
} finally {
lock.unlock();
}
}
public Object take() throws InterruptedException {
lock.lock();
try {
while (count == 0)
notEmpty.await();
Object x = items[takeptr];
if (++takeptr == items.length) takeptr = 0;
--count;
notFull.signal();
return x;
} finally {
lock.unlock();
}
}
}
分享到:
相关推荐
API(Application Programming Interface)是JDK的核心部分,它提供了一系列的类库和接口,允许程序员构建Java应用程序。这份"JDK1.8 api中文文档"是开发者理解并利用这些功能的关键资源。 首先,JDK1.8在语言层面...
JDK1.8进一步加强了注解的使用,如`@FunctionalInterface`用于标记函数式接口。 枚举类型(`enum`)是Java的特色,它提供了一种安全的常量表示方式,可以拥有方法和实现接口,极大地丰富了枚举的使用场景。 日期时间...
API(Application Programming Interface)是软件开发中的一个重要概念,它为开发者提供了一组工具,使得他们可以构建应用程序而无需从零开始。JDK 1.8 API分为中文版和英文版,尽管中文版对于初学者来说更容易理解...
"sun"包中的源码是Oracle JDK的一部分,其中包含了Java平台的一些核心实现,如反射、JNI(Java Native Interface)、线程管理、类加载器等。这些通常被标记为"非标准"或"私有",因为它们可能会随着JDK的更新而改变,...
2. **API概述**: API(Application Programming Interface)是一组预定义的函数、类、接口和其他编程元素,允许开发者构建Java应用程序。在JDK 13.0.1中,API涵盖了核心类库、集合框架、IO流、网络编程、多线程、...
JDK(Java Development Kit)是Java编程环境的核心组件,其中的API(Application Programming Interface)是一系列预先定义好的类和接口,提供了丰富的功能,使得开发者可以方便地实现各种复杂的功能,而无需从零...
API(Application Programming Interface)是一组预定义的函数、类和接口,用于软件之间的交互,对于Java程序员来说,理解和掌握JDK API是进行高效编程的基础。 在JDK 1.6版本中,开发者可以找到大量的核心类库,...
JDK 1.6是Java历史上的一个重要版本,它的API(Application Programming Interface)为开发者提供了丰富的类库和接口,使得开发人员能够更高效地构建稳定且跨平台的Java应用。 API文档是JDK的核心组成部分,它详细...
API(Application Programming Interface)是软件开发中的一个重要概念,它是预定义的一系列函数、类、接口和常量,用于构建应用程序。JDK API 1.6 包含了 Java 核心类库的详细说明,包括基础类型、集合框架、I/O 流...
《良葛格Java JDK 5.0学习笔记》是一份专为初学者设计的Java编程教程,旨在帮助读者深入理解JDK 5.0版本中的关键特性与概念。这份PDF文档详细介绍了Java语言的基础语法、核心类库以及新引入的特性和改进。以下是这份...
15. **JNI(Java Native Interface)**:Java的本地接口允许Java代码调用C/C++的库,实现性能优化或调用特定平台的功能。 Java JDK 6学习笔记——PPT简体版将详细解析以上知识点,通过实例演示和清晰的讲解,帮助...
在Java语言中,JDK是基础,它包含了编译器、运行时环境以及各种工具,而API(Application Programming Interface)则是一系列预先定义好的函数、类和接口,为开发者提供了与操作系统和其他软件交互的标准。JDK 1.6版...
5. **并发和多线程**:Java以其强大的并发模型而闻名,OpenJDK的源码揭示了`java.util.concurrent`包下各种并发工具类的实现,如`ExecutorService`、`Future`、`Lock`等。 6. **JMX(Java Management Extensions)*...
Java API,全称为Application Programming Interface,是一系列预先定义好的函数、接口和类,为程序员提供了编写Java程序所需的基本工具。在JDK_API_1_6_zh_CN.CHM文件中,包含了Java 6所有核心类库的详细说明,包括...
内容1:spingboot打包成 jar包 内置 tomcat 直接可以运行,out\artifacts 点 startup.bat ,maven,直接下载动态库 jdk1.8 64位。 内置 log4j2 日志文件,每天...访问 127.0.0.1:8092/lockInterface/aisha.do 即可测试
接口(Interface)是指定义了一组方法的集合,不能实例化,而抽象类(Abstract Class)是指定义了一组方法和变量的集合,可以实例化。 1.8 String常用的方法 String类提供了许多有用的方法,如substring、indexOf...
#### 一、JDK1.5的新特性 ##### 1. 自动装箱与拆箱 - **自动装箱**:指的是将基本数据类型自动转换成对应的包装类对象。 - 例如:`int i = 1; Integer j = i;` - **自动拆箱**:则是将包装类对象自动转换成基本...
HotSpot采用C++编写,它结合了解释器和Just-In-Time(JIT)编译器,提供了解析执行和动态编译两种模式。默认情况下,HotSpot会先通过解释器执行字节码,然后对频繁执行的热点代码进行JIT编译,以提高性能。HotSpot...
- **同步机制**:包括`synchronized`关键字、`wait()`、`notify()`和`notifyAll()`方法,以及`Lock`接口和`ReentrantLock`类。 - **并发工具类(java.util.concurrent)**:如`ExecutorService`、`Semaphore`、`...
线程同步机制包括synchronized关键字、wait/notify、Lock接口等。 九、Java SE(标准版)进阶 1. JavaFX:用于构建桌面应用程序的GUI框架 2. JDBC:Java数据库连接,用于与各种数据库进行交互 3. Swing:另一套图形...