Lock

lock接口

Lock lock = ...;
lock.lock();
try{//处理任务
}catch(Exception ex){
}finally{lock.unlock();   //释放锁
}

经常这样使用

Lock lock = ...;
if(lock.tryLock()) {try{//处理任务}catch(Exception ex){}finally{lock.unlock();   //释放锁} 
}else {//如果不能获取锁,则直接做其他事情
}

lock()方法

ReentrantLockLock接口的一个实现类,意思是“可重入锁”,接下来我们通过一个例子来学习lock()方法的正确使用方式。

因为Lock是一个接口所以我们在编程时一般会使用它的实现类,ReentrantLockLock接口的一个实现类,意思是“可重入锁”,接下来我们通过一个例子来学习lock()方法的正确使用方式。

示例1:

public class Test {private ArrayList<Integer> arrayList = new ArrayList<Integer>();public static void main(String[] args)  {final Test test = new Test();new Thread(){public void run() {test.insert(Thread.currentThread());};}.start();new Thread(){public void run() {test.insert(Thread.currentThread());};}.start();}  public void insert(Thread thread) {Lock lock = new ReentrantLock();    //注意这个地方lock.lock();try {System.out.println(thread.getName()+"得到了锁");for(int i=0;i<5;i++) {arrayList.add(i);}} catch (Exception e) {// TODO: handle exception}finally {System.out.println(thread.getName()+"释放了锁");lock.unlock();}}
}

输出:

Thread-1得到了锁` `Thread-0得到了锁` `Thread-0释放了锁` `Thread-1释放了锁

结果可能出乎你的意料,不对呀,按道理应该是一个线程得到锁其他线程不能获取锁了的啊,为什么会这样呢?是因为insert()方法中lock变量是一个局部变量。THread-0Thread-1获取到的是不同的锁,这样不会造成线程的等待。

那怎么才能利用lock()实现同步呢?相信你已经想到了,只要将Lock定义成全局变量就可以了。

public class Test {private ArrayList<Integer> arrayList = new ArrayList<Integer>();private Lock lock = new ReentrantLock();    //注意这个地方public static void main(String[] args)  {final Test test = new Test();new Thread(){public void run() {test.insert(Thread.currentThread());};}.start();new Thread(){public void run() {test.insert(Thread.currentThread());};}.start();}  public void insert(Thread thread) {lock.lock();try {System.out.println(thread.getName()+"得到了锁");for(int i=0;i<5;i++) {arrayList.add(i);}} catch (Exception e) {// TODO: handle exception}finally {System.out.println(thread.getName()+"释放了锁");lock.unlock();}}
}

结果:

Thread-0得到了锁` `Thread-0释放了锁` `Thread-1得到了锁` `Thread-1释放了锁

这样就是我们预期的结果了。

很多时候我们为了提高程序的效率不希望线程为了等待锁而一直阻塞,这个时候可以使用tryLock()可以达到目的。

示例,将之前的insert()方法修改成tryLock()实现:

 public void insert(Thread thread) {if(lock.tryLock()) {try {System.out.println(thread.getName()+"得到了锁");for(int i=0;i<5;i++) {arrayList.add(i);}} catch (Exception e) {// TODO: handle exception}finally {System.out.println(thread.getName()+"释放了锁");lock.unlock();}} else {System.out.println(thread.getName()+"获取锁失败");}
}

输出:

Thread-0得到了锁` `Thread-1获取锁失败` `Thread-0释放了锁

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

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

相关文章

红包的技术升级之旅

鸡年春节&#xff0c;红包再次成为年味儿最重要的催化剂。先是腾讯QQ钱包推出“LBSAR天降红包”等三种创新有趣的玩法&#xff0c;支付宝上线AR实景红包&#xff0c;微博亦推出视频红包等形式。虽然微信退出红包营销让人稍有意外&#xff0c;但用户对红包的热情仍未消减。 事实…

java中生成1000~10000之间的随机数

要生成在[min,max]之间的随机整数&#xff0c;可使用Random类进行相关运算&#xff1a; Random random new Random(); int s random.nextInt(max)%(max-min1) min; random.nextInt(max)表示生成[0,max]之间的随机数&#xff0c;然后对(max-min1)取模。 以生成[1000,10000]…

破坏双亲委派模型

转载自 破坏双亲委派模型 1.第一次破坏 由于双亲委派模型是在JDK1.2之后才被引入的&#xff0c;而类加载器和抽象类java.lang.ClassLoader则在JDK1.0时代就已经存在&#xff0c;面对已经存在的用户自定义类加载器的实现代码&#xff0c;Java设计者引入双亲委派模型时不得不做出…

volatile可以保证原子性吗

在之前我们了解到了线程的三大特性&#xff1a;原子性&#xff0c;可见性&#xff0c;有序性。 前面的例子我们知道了volatile可以保证共享变量的可见性&#xff0c;但是volatile可以保证原子性吗&#xff1f; 我们来看看&#xff1a; public class Test {public volatile i…

C# 7.0新功能

下面是对C#7.0 版本所有语言功能的描述。随着 Visual Studio “15” preview 4 的发布&#xff0c;大部分功能可以被更灵活的应用。现在正是时候将这些功能介绍给大家&#xff0c;你也可以借此让我们知道你的想法。 C#7.0 增加了很多新的功能&#xff0c;更专注于数据的消费&am…

MybatisPlus学习(四)条件构造器Wrapper方法详解

https://www.cnblogs.com/xianz666/p/13857733.html MybatisPlus学习&#xff08;四&#xff09;条件构造器Wrapper方法详解 文章目录 1、条件构造器2、QueryWrapper 2.1、eq、ne2.2、gt、ge、lt、le2.3、between、notBetween2.4、like、notLike、likeLeft、likeRight2.4、isN…

使用ueditor实现多图片上传案例

UEditor是由百度WEB前端研发部开发的所见即所得的开源富文本编辑器&#xff0c;具有轻量、可定制、用户体验优秀等特点。开源基于BSD协议&#xff0c;所有源代码在协议允许范围内可自由修改和使用。百度UEditor的推出&#xff0c;可以帮助不少网站开发者在开发富文本编辑器所遇…

自定义ClassLoader和双亲委派机制

转载自 自定义ClassLoader和双亲委派机制 ClassLoader ClassLoad&#xff1a;类加载器&#xff08;class loader&#xff09;用来加载 Java 类到 Java 虚拟机中。Java 源程序&#xff08;.java 文件&#xff09;在经过 Java 编译器编译之后就被转换成 Java 字节代码&#xff0…

ASP.NET Core 1.0 开发记录

ASP.NET Core 1.0 更新比较快&#xff08;可能后面更新就不大了&#xff09;&#xff0c;阅读注意时间节点&#xff0c;这篇博文主要记录用 ASP.NET Core 1.0 开发简单应用项目的一些记录&#xff0c;以备查阅。 ASP.NET Core 1.0 相关 Nuget 程序包源&#xff1a;https://api.…

volatile 关键字

volatile是干啥用的&#xff0c;有什么含义和特点呢&#xff1f; 当一个共享变量被volatile修饰时&#xff0c;它就具备了“可见性”&#xff0c;即这个变量被一个线程修改时&#xff0c;这个改变会立即被其他线程知道。当一个共享变量被volatile修饰时&#xff0c;会禁止“指…

使用ueditor实现多图片上传案例——实体类(Shopping.java)

/** * Title: Shopping.java * Package org.entity * Description: TODO该方法的主要作用&#xff1a; * author A18ccms A18ccms_gmail_com * date 2017-9-30 下午9:37:33 * version V1.0 */ package org.entity;/** * * 项目名称&#xff1a;test_fuwenben * 类…

深入浅出ClassLoader

转载自 深入浅出ClassLoader 你真的了解ClassLoader吗&#xff1f; 这篇文章翻译自zeroturnaround.com的 Do You Really Get Classloaders? &#xff0c;融入和补充了笔者的一些实践、经验和样例。本文的例子比原文更加具有实际意义&#xff0c;文字内容也更充沛一些&#xf…

三种获取Class类型的实例的方法

通过Object类中的getClass()方法&#xff1b;通过静态方法Class.forName("全类名")&#xff1b;通过类字面常量Class.class。 三种获取Class类型的实例的方法 方法1&#xff1a;通过Object类中的getClass()方法返回一个Class类型的实例 示例如下&#xff1a; Per…

使用ueditor实现多图片上传案例——Dao层(BaseDao)

package org.dao;import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List;/*** * * 项目名称&#xff1a;test_face_photo * 类名称&#…

微软任命LinkedIn高级副总裁为首席技术官

Kevin Scott曾是LinkedIn工程方面的高级VP&#xff0c;被任命为微软CTO后&#xff0c;Scott将全面统筹微软战略规划&#xff0c;以主动的姿态推进公司间合作&#xff0c;以最大化微软在伙伴及客户间的影响力。据了解&#xff0c;该职位为新创职位&#xff0c;为微软公司级CTO&a…

四种常见的 POST 提交数据方式对应的content-type取值

做前后端分离一般都有第3中 &#xff0c; 第一种 基本上jquery那年代用的了 第2种在需要传文件时用的 https://www.cnblogs.com/wushifeng/p/6707248.html 四种常见的 POST 提交数据方式对应的content-type取值 application/x-www-form-urlencoded 这应该是最常见的 POST 提…

jQuery 基础教程 (三)之jQuery的选择器

一、jQuery 选择器 &#xff08;1&#xff09;选择器是 jQuery 的根基, 在 jQuery 中, 对事件处理, 遍历 DOM 和 Ajax 操作都依赖于选择器 &#xff08;2&#xff09;jQuery 选择器的优点: 简洁的写法 $(#id) //documnet.getElementById(id); $(p) //documnet.getEl…

用rollback()VS不用rollback()

不用rollback()表面和用了rollback()效果一样&#xff0c;但是不用rollback()可能导致被锁住的数据不能及时的释放&#xff08;需要等事物超时释放&#xff09;,会影响下一次的事物操作

使用ueditor实现多图片上传案例——Dao层(IBaseDaoUtil)

/*** */ package org.dao;/*** * * 项目名称&#xff1a;test_face_photo * 类名称&#xff1a;IBaseDaoUtil * 类描述&#xff1a; 共用接口 * 创建人&#xff1a;Mu Xiongxiong * 创建时间&#xff1a;2017-9-22 下午6:59:36 * 修改人&#xff1a;Mu Xiong…

update字段变更SpringBoot @JsonProperty的使用属性的名称序列化为另外一个名称

https://blog.csdn.net/wtb617806038/article/details/86093301 Restful 接口调用Json接收相关问题 1、背景&#xff1a; 在项目上使用SpringBoot为框架&#xff0c;调用第三方接口时&#xff0c;返回的参数类型&#xff0c;不符合标准的命名规则&#xff0c;需要进行处理&am…