- Java并发是什么?
- Java并发开发环境配置
- Java并发主要操作
- Java并发线程间通信
- Java并发同步
- Java并发死锁
- 实用类实例
- 锁示例
- 原子变量示例
- 执行者示例
- 线程池示例
- 高级示例
- 并发集合
Java并发Lock接口
java.util.concurrent.locks.Lock
接口用作线程同步机制,类似于同步块。新的锁定机制更灵活,提供比同步块更多的选项。 锁和同步块之间的主要区别如下:
- 序列的保证 - 同步块不提供对等待线程进行访问的序列的任何保证,但
Lock
接口处理它。 - 无超时,如果未授予锁,则同步块没有超时选项。
Lock
接口提供了这样的选项。 - 单一方法同步块必须完全包含在单个方法中,而
Lock
接口的方法lock()
和unlock()
可以以不同的方式调用。
Lock类中的方法
以下是Lock
类中可用的重要方法的列表。
编号 | 方法 | 描述说明 |
---|---|---|
1 | public void lock() |
获得锁 |
2 | public void lockInterruptibly() |
获取锁定,除非当前线程中断 |
3 | public Condition newCondition() |
返回绑定到此Lock 实例的新Condition 实例 |
4 | public boolean tryLock() |
只有在调用时才可以获得锁 |
5 | public boolean tryLock(long time, TimeUnit unit) |
如果在给定的等待时间内自由,并且当前线程未被中断,则获取该锁。 |
6 | public void unlock() |
释放锁 |
示例
以下TestThread
程序演示了使用Lock
接口的一些方法。 这里我们使用lock()
获取锁和unlock()
来释放锁。
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; class PrintDemo { private final Lock queueLock = new ReentrantLock(); public void print() { queueLock.lock(); try { Long duration = (long) (Math.random() * 10000); System.out.println(Thread.currentThread().getName() + " Time Taken " + (duration / 1000) + " seconds."); Thread.sleep(duration); } catch (InterruptedException e) { e.printStackTrace(); } finally { System.out.printf("%s printed the document successfully.\n", Thread.currentThread().getName()); queueLock.unlock(); } } } class ThreadDemo extends Thread { PrintDemo printDemo; ThreadDemo( String name, PrintDemo printDemo) { super(name); this.printDemo = printDemo; } @Override public void run() { System.out.printf("%s starts printing a document\n", Thread.currentThread().getName()); printDemo.print(); } } public class TestThread { public static void main(String args[]) { PrintDemo PD = new PrintDemo(); ThreadDemo t1 = new ThreadDemo( "Thread - 1 ", PD ); ThreadDemo t2 = new ThreadDemo( "Thread - 2 ", PD ); ThreadDemo t3 = new ThreadDemo( "Thread - 3 ", PD ); ThreadDemo t4 = new ThreadDemo( "Thread - 4 ", PD ); t1.start(); t2.start(); t3.start(); t4.start(); } }
执行上面示例代码,得到以下结果 -
Thread - 1 starts printing a document Thread - 4 starts printing a document Thread - 3 starts printing a document Thread - 2 starts printing a document Thread - 1 Time Taken 4 seconds. Thread - 1 printed the document successfully. Thread - 4 Time Taken 3 seconds. Thread - 4 printed the document successfully. Thread - 3 Time Taken 5 seconds. Thread - 3 printed the document successfully. Thread - 2 Time Taken 4 seconds. Thread - 2 printed the document successfully.
在上面的示例中,使用ReentrantLock
类作为Lock
接口的一个实现。 ReentrantLock
类允许线程锁定方法,即使它已经具有其他方法锁。
分类导航
- Java教程
- Vim教程
- Swing教程
- Spring教程
- Spring Web Services教程
- Spring MVC教程
- Spring JDBC教程
- Spring Cloud教程
- Spring Boot教程
- Spring Boot CLI教程
- Spring Batch教程
- Spring AOP教程
- PDFBox教程
- JSP教程
- JSF教程
- JPA教程
- Java面向对象设计
- Java设计模式
- Java虚拟机教程
- Java泛型教程
- Java正则表达式教程
- Java数据类型教程
- Java并发编程教程
- Java密码学教程
- Java多线程教程
- Java国际化(i18n)教程
- JavaFX教程
- Java9教程
关注微信小程序
扫描二维码
程序员编程王