文档章节

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 synchronized 和 ReentrantLock对比

Java synchronized 和 ReentrantLock对比 前段时间学习了java的线程同步的一些知识,认识到了线程同步的关键字synchronized 和 线程锁java.util.concurrent.lock包下的 ReentrantLock ,下面...

介鬼
06/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

sed命令扩展使用操作

打印某行到某行之间的内容 假若文件test.txt的内容是: ertfff**[abcfd]123324444[rty]**fgfgf 怎么能截取 [abcfd]123324444[rty] 这一部分出来呢? 操作命令: 知道开始行和结...

野雪球
29分钟前
1
0
JVM内存笔记

Hotspot JVM 中的 Java 线程与原生操作系统线程有直接的映射关系。当线程本地存储、缓 冲区分配、同步对象、栈、程序计数器等准备好以后,就会创建一个操作系统原生线程。 Java 线程结束,原...

凌渡
35分钟前
1
0
284. Peeking Iterator

Description Tag: Design Difficulties: Medium Given an Iterator class interface with methods: next() and hasNext(), design and implement a PeekingIterator that support the pee......

52iSilence7
37分钟前
1
0
防止快速重复点击的两种思维

防止重复执行的两种思维 场景 下单时,提交按钮,因为网络卡顿或者手快重复点击,导致重复提交订单; 微博,更新个人状态或发表评论时,快速多次点击[发送]按钮,导致相同的信息发送多次. 解决思路 ...

黄威
今天
0
0
在windows环境下使用Virtualbox虚拟Debian系统来运行Docker

标题绕口。 我之前一直使用 Virtualbox 和 homestead 来运行我的 PHP 开发环境。最近决心开始尝试 DevOps,使得开发、部署容器化,来化解人为操作失误和环境不兼容等问题造成的各种损失。就打...

zgldh
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部