文档章节

java中的锁 Lock

 小鱼--
发布于 2017/05/19 10:24
字数 705
阅读 20
收藏 0

锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源。

Lock

synchronized块或方法可以隐式的获取锁,但是它将锁的获取和释放固化了,即先获取再释放。

Lock,在JavaSE5之后,在使用时需要显式的获取和释放锁,相比于synchronized,拥有锁获取与释放的可操作性、可中断的获取锁以及超时获取锁等同步特性。

 

Lock接口提供的synchronized关键字不具备的主要特性

特性  描述
尝试非阻塞的获取锁 当前线程尝试获取锁,如果这一时刻锁没有被其它线程获取到,则成功获取并持有锁
能被中断地获取锁  与synchronized不同,获取到的锁能够响应中断,当获取到锁的线程被中断时,中断异常将会抛出,同时锁会被释放
超时获取锁 在指定的截止时间之前获取锁,如果截止时间到了仍旧无法获取锁,则返回

Lock接口API

方法名称 描述
void lock() 获取锁。如果锁不可用,出于线程调度目的,将禁用当前线程,并且在获得锁之前,该线程将一直处于休眠状态
void lockInterruptibly() throws InterruptedException
  • 如果当前线程未被中断,则获取锁。
  • 如果锁可用,则获取锁,并立即返回。
  • 如果锁不可用,出于线程调度目的,将禁用当前线程,并且在发生以下两种情况之一以前,该线程一直处于休眠状态:
  1. 锁由当前线程获得
  2. 其他某个线程中断当前线程,并且支持对锁获取的中断
  • 如果当前线程存在以下情况,则将抛出InterruptedException,并清除当前线程的中断状态
  1. 在进入此方法时已经设置了该线程的中断状态
  2. 在获取锁时被中断,并且支持对锁获取的中断
boolean tryLock() 尝试非阻塞的获取锁。
仅在调用时锁为空闲状态才获取锁。如果锁可用,则获取锁,并立即返回值true,如果锁不可用,则此方法将立即返回值false
boolean tryLock(long time,TimeUnit unit) throws InterruptedException

超时的获取锁,当前线程在以下3种情况下会返回:

  1. 当前线程在超时时间内获得了锁
  2. 当前线程在超时时间内被中断
  3. 超时时间结束,返回false
void unlock() 释放锁
Condition newCondition() 获取等待通知组件,该组件和当前的锁绑定,当前线程只有获得了锁,才能调用该组件的wait()方法,而调用后,当前线程将释放

 

© 著作权归作者所有

共有 人打赏支持
粉丝 0
博文 17
码字总数 5400
作品 0
通州
程序员
java Lock interface 与synchronized使用注意--java线程(第三版)

在java中,跟着synchronized关键字的lock都会在thread离开同步块的范围时被释放掉,即使是因为异常而离开范围也是一样。所以在java中使用synchronized关键字时,异常导致不释放锁而导致死锁的...

Beaver_
2015/04/06
0
0
Java轻量级锁原理详解(Lightweight Locking)

大家知道,Java的多线程安全是基于Lock机制实现的,而Lock的性能往往不如人意。 原因是,monitorenter与monitorexit这两个控制多线程同步的bytecode原语,是JVM依赖操作系统互斥(mutex)来实现...

serenity
2015/08/11
0
0
21、Java并发性和多线程-Java中的锁

以下内容转自http://ifeve.com/locks/: 锁像synchronized同步块一样,是一种线程同步机制,但比Java中的synchronized同步块更复杂。因为锁(以及其它更高级的线程同步机制)是由synchronize...

easonjim
2017/06/16
0
0
【Java并发性和多线程】Java中的锁

本文为转载学习 原文链接:http://ifeve.com/locks/ 锁像synchronized同步块一样,是一种线程同步机制,但比Java中的synchronized同步块更复杂。因为锁(以及其它更高级的线程同步机制)是由...

heroShane
2014/02/02
0
0
Java 8新特性探究(十)StampedLock将是解决同步问题的新宠

Java8就像一个宝藏,一个小的API改进,也足与写一篇文章,比如同步,一直是多线程并发编程的一个老话题,相信没有人喜欢同步的代码,这会降低应用的吞吐量等性能指标,最坏的时候会挂起死机,...

OSC闲人
2014/05/13
0
30

没有更多内容

加载失败,请刷新页面

加载更多

下一页

nginx访问日志-日志切割-静态文件不记录日志和过期时间

nginx访问日志: vim /usr/local/nginx/conf/nginx.conf #搜索log_format 该字段定义日志格式,默认如下: #combined_realip日志格式的名字,可随意定义; 定义访问日志: 需在虚拟主机配置文...

ZHENG-JY
7分钟前
0
0
180.mariadb 主从复制

参考:https://blog.csdn.net/chengxuzaza/article/details/62042920 睡觉睡觉,明天写 1.效果 当主库中数据有变化的时候,从库就自动同步 2. 环境要求 至少两台 linux服务器 (教程:https...

Lucky_Me
17分钟前
0
0
erlng file id3v1 id3v1.1

%% ---%% Excerpted from "Programming Erlang",%% published by The Pragmatic Bookshelf.%% Copyrights apply to this code. It may not be used to create training material, %% ......

xueyuse0012
18分钟前
1
0
RabbitMq的安装

环境Centos6.5 32位 JDK 1.7.8 Jdk的卸载 rpm -qa|grep jdk yum –y remove 上边的安装包 JDK的安装 Rpm –ivh jdk安装包 配置环境变量 export JAVA_BIN=/usr/java/jdk1.7.0_80/bin export J......

DemonsI
22分钟前
0
0
http和https协议

HTTPS全称为Hypertext Transfer Protocol over Secure Socket Layer,中文含义为“超文本传输协议在安全加密字层”,简单来说就是加密数据传输,通俗的说就是安全连接。 HTTPS安全超文本传输...

寰宇01
28分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部