同步关键词lock

概述

1、API在JDK的java.util.concurrent.locks下。

2、不是Java关键字,是接口。

3、ReentrantLock是JDK唯一实现了Lock接口的类。

public interface Lock {//获取锁void lock();//可以响应中断的锁void lockInterruptibly() throws InterruptedException;//尝试获取锁boolean tryLock();//尝试获取锁,如果拿不到会等待time的时间boolean tryLock(long time, TimeUnit unit) throws InterruptedException;//释放锁void unlock();
}

四个获取锁方法

lock()

是平常使用得最多的一个方法,就是用来获取锁。如果锁已被其他线程获取,则进行等待。
由于在前面讲到如果采用Lock,必须主动去释放锁,并且在发生异常时,不会自动释放锁。因此一般来说,使用Lock必须在try{}catch{}块中进行,并且将释放锁的操作放在finally块中进行,以保证锁一定被被释放,防止死锁的发生。

实例:http://blog.csdn.net/zengmingen/article/details/53257891

tryLock()

是有返回值的,它表示用来尝试获取锁,如果获取成功,则返回true,如果获取失败(即锁已被其他线程获取),则返回false,也就说这个方法无论如何都会立即返回。在拿不到锁时不会一直在那等待。

实例:http://blog.csdn.net/zengmingen/article/details/53259279

tryLock(long time, TimeUnit unit)

和tryLock()方法是类似的,只不过区别在于这个方法在拿不到锁时会等待一定的时间,在时间期限之内如果还拿不到锁,就返回false。如果如果一开始拿到锁或者在等待期间内拿到了锁,则返回true。

实例:http://blog.csdn.net/zengmingen/article/details/53259394

lockInterruptibly()

比较特殊,当通过这个方法去获取锁时,如果其他线程正在等待获取锁,则这个线程能够响应中断,即中断线程的等待状态。也就使说,当两个线程同时通过

lockInterruptibly()想获取某个锁时,假若此时线程A获取到了锁,而线程B只有等待,那么对线程B调用threadB.interrupt()方法能够中断线程B的等待过程。

【注意:等待的那个线程B可以被中断,不是正在执行的A线程被中断。
注意,当一个线程获取了锁之后,是不会被interrupt()方法中断的。
因此当通过lockInterruptibly()方法获取某个锁时,如果不能获取到,只有进行等待的情况下,是可以响应中断的。
而用synchronized修饰的话,当一个线程处于等待某个锁的状态,是无法被中断的,只有一直等待下去。】

实例:http://blog.csdn.net/zengmingen/article/details/53260650

Lock和synchronized的选择

  1)Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现。
  2)synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生。

而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁。
  3)Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断;
  4)通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。
  5)Lock可以提高多个线程进行读操作的效率。
  在性能上来说,如果竞争资源不激烈,两者的性能是差不多的,而当竞争资源非常激烈时(即有大量线程同时竞争),此时Lock的性能要远远优于synchronized。在具体使用时要根据适当情况选择。




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/538981.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java bitset转string_将java BitSet保存到DB

默认情况下,JPA使用Java序列化来保存未知Serializable类型的属性(以便将序列化表示存储为byte []).通常它不是您想要的,因为可以有更有效的方式来表示您的数据.例如,BitSet可以有效地表示为数字(如果它的大小有界),或者byte [],或其他东西(遗憾的是,BitSet不提供进行这些转换的…

python读取raw图片文件_在python下读取并展示raw格式的图片实例

raw文件可能有些人没有,因此,先用一张图片创建一个raw格式的文件(其实可以是其他类型的格式文件) import numpy as np import cv2 img cv2.imread(cat.jpg) # 这里需要我们在当前目录下放一张名为cat.jpg的文件 img.tofile(cat.r…

python怎么网络通信_深入Python中的网络通信

TCP/IP计算机与网络设备两情侣要谈恋爱,相互通信,那么双方就必须有规则。基于相同的方法,不同的硬件、操作系统之间的通信,都需要一种规则。而我们就把这种规则称为协议(protocol)。TCP/IP 是互联网相关各类协议族的总称。TCP/IP是…

ReadWriteLock读写文件

概述 ReadWriteLock是一个接口,在它里面只定义了两个方法:一个读的锁和一个写的锁。 读的锁:A线程获取了读的锁,那么B线程也可以获取读的锁。 写的锁:A线程获取了写的锁,那么B线程不能获取读也不能获取写…

搞懂 Java HashMap 源码

HashMap 源码分析 前几篇分析了 ArrayList , LinkedList ,Vector ,Stack List 集合的源码,Java 容器除了包含 List 集合外还包含着 Set 和 Map 两个重要的集合类型。而 HashMap 则是最具有代表性的,也是我们最常使用到…

python 怎么表示sqlserver null_如何使用Python将sqlserver查询输出写入.txt文件?

我是Python新手,尝试连接到sqlserverdb并将查询的输出转换成一个flat.txt文件。在一些代码正在工作,但是只写了将近1000条记录,然后就停止了。在Python版本:2.7.13。在下面的代码能够把100万条记录全部写入csv文件而不是.txt文件&…

python中object是什么类型_Python 的 type 和 object 之间是怎么一种关系?

class,metaclass,instance,subclass,base 以下成立: 对任意的A,A是instance(推论:任意class也是instance) 对任意A,存在B,使得B是A的class A是cla…

java8新生代_jdk8.0的jvm详情

jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。命令的格式如下:jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数]注意:使用的jdk版本是jdk8.[work16-11-118qf-pms]$ jstat -class 32417Loaded?? Bytes?? Unloaded?? B…

Java中的Runnable、Callable、Future、FutureTask的区别与示例

原文地址:http://blog.csdn.net/bboyfeiyu/article/details/24851847 --------------------------------------------------------- Java中存在Runnable、Callable、Future、FutureTask这几个与线程相关的类或者接口,在Java中也是比较重要的几个概念&am…

sql count为空时显示0_C0010负坐标显示为正数+红色0值参考线

小伙伴们早上好啊!今天继续为大家分享柱形图的美化技巧。希望大家认真阅读Excel文件和教程,有的图表看起来简单,实际上在细节处理上用了很多技巧,大家要多多体会。C0010-负坐标显示为正数红色0值参考线效果图图表概述本图可以用来…

配置IISExpress允许外部访问

配置IISExpress允许外部访问 1.找到IISExpress的配置文件&#xff0c;位于 <文档>/IISExpress/config文件夹下&#xff0c;打开applicationhost.config&#xff0c;找到如下代码&#xff1a;<site name"WebSite1" id"1" serverAutoStart"tru…

python布尔测试对象_python布尔类型和逻辑运算

布尔类型 python中True表示真&#xff0c;False表示假&#xff0c;它们是布尔类型&#xff1a;1 2>>> type(True) 在python中&#xff0c;bool的True和False是数值1和0的字符串表示格式&#xff0c;实际上bool类型是int类型的一个子类。1 2>>> bool.__bases_…

mac预装的php路径,Mac使用系统自带php和Apache

最美的语言本文将介绍在Mac环境下如何使用系统本身所带有的Apache(阿帕奇服务器)通过预装的PHP版本来运行PHP的相关代码&#xff0c;相对来讲在OS X系统下相对好配置一些&#xff0c;因为Apache和PHP都预装好了&#xff0c;如果是Windows环境我们需要自己安装ApachePHPMysql(通…

线程池与Callable更配哦

概述 Callable介绍见&#xff1a;http://blog.csdn.net/zengmingen/article/details/53288119 多线程介绍见&#xff1a;http://blog.csdn.net/zengmingen/article/details/53284999 代码 TaskCallable.javapackage multithreading.pool;import java.util.concurrent.Callabl…

IP编址,IP地址介绍与子网划分方法

网络层位于数据链路层与传输层之间。网络层中包含了许多协议&#xff0c;其中最为重要的协议就是IP协议。网络层提供了IP路由功能。理解IP路由除了要熟悉IP协议的工作机制之外&#xff0c;还必须理解IP编址以及如何合理地使用IP地址来设计网络。 上层协议类型 以太网帧中的Typ…

3- OpenCV+TensorFlow 入门人工智能图像处理-TensorFlow入门

tensorflow基础入门 思考一个问题: 如何刚好学习TensorFlow 类比为一门开发语言&#xff0c;学会语法&#xff0c;api的调用&#xff0c; 原理性掌握。语言的要素: 基础数据类型 运算符 流程 字典 数组 import tensorflow as tf# 常量&#xff0c;指定数据类型 data1 tf.const…

r 函数返回多个值_第四讲 R描述性统计分析

在“R与生物统计专题”中&#xff0c;我们会从介绍R的基本知识展开到生物统计原理及其在R中的实现。以从浅入深&#xff0c;层层递进的形式在投必得医学公众号更新。在上一讲中&#xff0c;我们介绍了第三讲 R编程基础-矩阵和数据框 (戳这里即可跳转)。到现在为止&#xff0c;大…

python双线性插值函数_双线性插值法原理 python实现

码字不易&#xff0c;如果此文对你有所帮助&#xff0c;请帮忙点赞&#xff0c;感谢&#xff01;一. 双线性插值法原理&#xff1a;① 何为线性插值&#xff1f;插值就是在两个数之间插入一个数&#xff0c;线性插值原理图如下&#xff1a;在位置 x 进行线性插值&#xff0c;插…

张恩民 php,php100教程_php100张恩民php视频 56课时_网站编程_寂涯网络学习基地

1、PHP基本语法和数据类型&#xff1a;(1)、PHP基本语法&#xff1a;1、htm 和 php 混编2、一个语句以 ; (分号结束)3、如何定义一个变量&#xff0c;和变量的使用(2)、PHP数据运算类型四种标量类型&#xff1a;boolean(布尔型)integer(整型)float(浮点型&#xff0c;也作“do…

Oracle 自带sqldeveloper导入数据到表

步骤 1、建一张字段名和类型与要导入数据一致的表。 2、如果是excel文件&#xff0c;另存为 csv文件。 因为excel文件遇到空格会报错&#xff0c;excel文件太大工具会读取文件失败。 而csv文件是秒级读取&#xff0c;有空格也会导入不会报错。 ------------- 更多的Java&am…