Java Lock接口

java.util.concurrent.locks.Lock接口用作线程同步机制,类似于同步块。新的锁定机制更灵活,提供比同步块更多的选项。 锁和同步块之间的主要区别如下:

序列的保证 - 同步块不提供对等待线程进行访问的序列的任何保证,但Lock接口处理它。

无超时,如果未授予锁,则同步块没有超时选项。Lock接口提供了这样的选项。

单一方法同步块必须完全包含在单个方法中,而Lock接口的方法lock()和unlock()可以以不同的方式调用。

1 Lock接口的方法

以下是Lock类中可用的重要方法的列表。

方法

描述

public void lock()

获得锁

public void lockInterruptibly()

获取锁定,除非当前线程中断

public Condition newCondition()

返回绑定到此Lock实例的新Condition实例

public boolean tryLock()

只有在调用时才可以获得锁

public boolean tryLock(long time, TimeUnit unit)

如果在给定的等待时间内自由,并且当前线程未被中断,则获取该锁。

public void unlock()

释放锁

2 Lock接口的案例

以下TestThread程序演示了使用Lock接口的一些方法。 这里我们使用lock()获取锁和unlock()来释放锁。

package com.yiidian;

/**

* 一点教程网: http://www.yiidian.com

*/

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 lock接口_Java Lock接口相关推荐

  1. java map 教程_Java Map接口

    Java Map接口 在本教程中,我们将学习Java Map接口及其方法. Java collections框架的Map接口提供了Map数据结构的功能. 它实现了Collection接口. map的工 ...

  2. java 请求响应_java http接口请求响应 request response

    接口类: 1 package org.sunshine.dcda.epg.wechat.controller.niao; 2 3 import javax.servlet.http.HttpServl ...

  3. java的iterator接口_java Iterator接口和LIstIterator接口分析_java_脚本之家

    java  Iterator接口和LIstIterator接口分析 目录 1.Iterator接口 2.ListIterator 3.Iterator和ListIterator的区别 正文 在继续看A ...

  4. java工厂到接口_Java基础——接口简单工厂

    声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权:凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记. 一.接口 1.接口只做规范和声明不做实现: 2.java中类 ...

  5. java supplier接口_Java函数式接口Supplier接口实例详解

    这篇文章主要介绍了Java函数式接口Supplier接口实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 JDK提供了大量常用的函数式接口以丰 ...

  6. java 枚举 接口_java枚举接口

    java中的枚举类 枚举类(enum),与class和interface关键字地位相同. 枚举类是一个特殊的类,可以有自己的成员变量.方法.构造器,可以实现一个或多个接口.一个java源文件中只能有一 ...

  7. interface接口_Java程序设计--接口interface(笔记)

    有时必须从几个类中派生出一个子类,继承它们所有的属性和方法.但是,Java不支持多重继承.有了接口,就可以得到多重继承的效果. 有时必须从几个类中抽取出一些共同的行为特征,而它们之间又没有继承关系,仅 ...

  8. java 微信多媒体文件_java微信接口之三—上传多媒体文件

    一.微信上传多媒体接口简介 1.请求:该请求是使用post提交from来实现的,我们可以在网页上进行表单提交来实现.地址为: http://file.api.weixin.qq.com/cgi-bin ...

  9. java 飞信接口_java 飞信接口

    本接口走的是移动wap飞信接口,绝对安全 package net.duohuo.tengzhinei.Feition; import java.io.BufferedReader; import ja ...

最新文章

  1. 【每日训练】2020/11/8(规律 + 二进制、单调栈 + 前缀和,后缀和、bitset + 枚举)
  2. Netty with protobuf(二)
  3. python项目开发案例-Python项目开发案例集锦 PDF 全彩超清版
  4. kotlin与java对比
  5. 由system.currentTimeMillis() 获得当前的时间
  6. 我眼中的软件测试,交互设计师眼中的软件测试
  7. Oracle Grid Infrastructure: Understanding Split-Brain Node Eviction (文档 ID 1546004.1)
  8. 浏览器阻止window.open的解决方案
  9. 安卓逆向_12 --- jeb工具的使用 ( 动态调试 smali 代码 【 普通调试 和 debug调试 】)
  10. matlab2c使用c++实现matlab函数系列教程-geomean函数
  11. HDU 4946 Area of Mushroom(2014 Multi-University Training Contest 8)
  12. 51job简历如何导出pdf格式
  13. 专科计算机专业软件工程,软件工程专业专科学校都有哪些?
  14. ACCU天气API以及Okhttp、Retrofit、RxJava的使用
  15. 计算机网络——已知 IP 地址,求解子网的网络地址
  16. python 策略回测期货_量化投资实战教程(1)—基于backtrader的简单买入卖出策略
  17. opencv android 羽化,学习OpenCV--羽化(模糊边缘)
  18. 【easyui】easyui combobox 如何清空已加载的数据?
  19. linux 文件取交集、并集
  20. PSP升级速度令然惊喜!(update:2007.10.13)

热门文章

  1. Docker 常用命令备忘录
  2. 10款中小企业必备的开源免费安全工具
  3. 哲学到编程:思想的实例化
  4. 通过telnet连接查看memcache服务器
  5. android自动化框架简要剖析(一):运行原理+基本框架
  6. openfire 的配置文件
  7. 77种互联网盈利创新模式(3)
  8. 庖丁解牛ASP.NET3.5控件和组件开发技术-(1)服务器控件概述
  9. 服务器性能测试典型工具介绍
  10. 8 一点就消失_消失的莉莉安(26)