Lock锁

锁实现提供了比使用synchronized方法和语句更广泛的锁操作。它们允许更灵活的结构,可能有不同的属性,可能支持多个关联的Condition对象。

锁是用于控制多个线程对共享资源的访问的工具。

通常,锁提供对共享资源的独占访问:一次只有一个线程可以获得锁,并且所有访问共享资源的访问都需要先获得锁。但是,有些锁可能允许并发访问共享资源。例如readwritellock的读锁。

同步方法或语句的使用提供了对每个对象关联的隐式监视器锁的访问,但强制所有锁的获取和释放都以块结构的方式进行:当多个锁被获取时,它们必须以相反的顺序被释放,并且所有的锁都必须在获取锁的同一个词法作用域中被释放。虽然同步方法和语句的作用域机制使使用监视器锁进行编程变得更加容易,并有助于避免许多涉及锁的常见编程错误,但在某些情况下,您需要以更灵活的方式使用锁。

例如,一些用于遍历并发访问的数据结构的算法需要使用“手拉手”或“链锁”:您获取节点A的锁,然后是节点B,然后释放A并获取C,然后释放B并获取D,等等。

Lock接口的实现允许在不同范围内获取和释放锁,并允许以任何顺序获取和释放多个锁,从而允许使用这种技术。

传统synchronized
synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种:

1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;
  2. 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;
  3. 修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;
  4. 修改一个类,其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对象。

lock.tryLock()

仅在调用时锁是空闲的情况下才获取锁。

  • 如果锁可用,则获取锁,并立即返回值为true。
  • 如果锁不可用,那么这个方法将立即返回值为false
import org.apache.commons.lang.RandomStringUtils;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;class tryLockTest {private static Lock lock = new ReentrantLock(true);public static void main(String[] args) {for (int i = 0; i < 40; i++) {//启动多个线程进行获取tokennew Thread(() -> {getToke();}, "a" + i).start();}}private static void getToke(int i) {if (lock.tryLock()) {//生成tokenString token = RandomStringUtils.randomAlphanumeric(21);System.out.println(Thread.currentThread().getName() + "-->拿到token:" + token);//睡眠100毫秒,增加冲突try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}} else {System.out.println(Thread.currentThread().getName() + "-->未拿到token");}}
}

执行结果

a1–>未拿到token
a2–>未拿到token
a4–>未拿到token
a5–>未拿到token
a6–>未拿到token
a3–>未拿到token
a7–>未拿到token
a10–>未拿到token
a13–>未拿到token
a31–>未拿到token
a14–>未拿到token
a8–>未拿到token
a9–>未拿到token
a19–>未拿到token
a21–>未拿到token
a26–>未拿到token
a16–>未拿到token
a18–>未拿到token
a24–>未拿到token
a28–>未拿到token
a29–>未拿到token
a30–>未拿到token
a11–>未拿到token
a34–>未拿到token
a35–>未拿到token
a32–>未拿到token
a33–>未拿到token
a37–>未拿到token
a15–>未拿到token
a20–>未拿到token
a38–>未拿到token
a39–>未拿到token
a17–>未拿到token
a23–>未拿到token
a22–>未拿到token
a12–>未拿到token
a36–>未拿到token
a25–>未拿到token
a27–>未拿到token
a0–>拿到token:FFMMDLGi3z7ngKkFG3Nq7

lock.tryLock()使用与synchronized比较相关推荐

  1. 多线程环境中lock.trylock方法争抢锁

    在多线程或分布式环境中,经常需要用到锁,trylock有两种用法,一种是不带参数:不设置等待时间,获取失败立即返回false.另一种是带等待时间的,线程会先挂起等待设置的时间结束如果还未获取到锁则返回 ...

  2. ReentrantLock中lock/trylock/lockInterruptibly方法的区别及源码解析

    看了几篇关于这三者区别的文章,但都说的不够具体,自己去读了下源码,大概是清楚了三者的功能,不想了解源码的可以跳到最后看总结. 首先,ReentrantLock类中使用了大量的CAS操作,也就是Comp ...

  3. Linux学习之系统编程篇:互斥锁(pthread_mutex_init / lock / trylock / unlock / destroy)

    一.主要函数介绍 (1)定义锁 : pthread_mutex_t mutex; //互斥锁 数据类pthread_mutex_t (2)初始化锁: int pthread_mutex_init(pt ...

  4. java并发vol_java 并发中 volitile、synchronized和lock的比较(一)

    1.volitile和(synchronnized.lock) 首先比较volitile和synchronnized,volitile线程不安全,但是synchronized则是线程安全的. voli ...

  5. Java 对synchronized的补充Lock锁

    Java并发编程:Lock 从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方式来实现同步访问,那就是Lock. 也许有朋友会问,既然都可以通过synchr ...

  6. 一. synchronized 的局限性 与 Lock 的优点

    我们已经知道,synchronized 是Java的关键字,是Java的内置特性,在JVM层面实现了对临界资源的同步互斥访问,但 synchronized 粒度有些大,在处理实际问题时存在诸多局限性, ...

  7. Lock和synchronized比较详解

    原文:http://www.cnblogs.com/handsomeye/p/5999362.html 今天看了并发实践这本书的ReentantLock这章,感觉对ReentantLock还是不够熟悉 ...

  8. Synchronized和Lock有什么区别

    前言 早期的时候我们对线程的主要操作为: synchronized wait notify 然后后面出现了替代方案 lock await singal 问题 synchronized 和 lock 有 ...

  9. Lock与synchronized 的区别

    1.ReentrantLock 拥有Synchronized相同的并发性和内存语义,此外还多了 锁投票,定时锁等候和中断锁等候 线程A和B都要获取对象O的锁定,假设A获取了对象O锁,B将等待A释放对O ...

  10. Java并发编程:Lock和Synchronized 转

    在上一篇文章中我们讲到了如何使用关键字synchronized来实现同步访问.本文我们继续来探讨这个问题,从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方 ...

最新文章

  1. sklearn中的fit_transform和transform以及什么时候使用
  2. consul 命令行参数
  3. boost::hana::capture用法的测试程序
  4. 后端技术:Java代码优秀案例,一定对你有提升!
  5. [scikit-learn 机器学习] 6. 逻辑回归
  6. Mysql写入数据时,adapter 日志报ES连接错误
  7. Android 系统性能优化(80)---Android性能优化:这是一份详细的布局优化 指南(含lt;includegt;、lt;Viewstubgt;、lt;mergegt;)
  8. gdal mysql乱码_GDAL读取S-57海图数据中文属性值乱码问题解决(续)
  9. JavaScript 字符串截取方法汇总
  10. 合格前端系列第九弹-前端面试那些事
  11. 计算机视觉实战(八)直方图与傅里叶变换
  12. Atitit oil painting article list sumup s55 C:\Users\Administrator\Desktop\油画技术资料包\Atitit Atitit 图像
  13. 看完这篇就够了,mac版本最新Camera Raw 15.1 新功能HDR详解
  14. 工业控制系统如何实现网络安全等级保护的相关要求
  15. 质量与规范,敬我们那些年欠下的技术债
  16. 【观察】并购魔方安全,联软科技再启新征程
  17. What?Tomcat-竟然也算中间件?
  18. php如何锁定表,PHPExcel冻结(锁定)表头的简单实现方法
  19. openSUSE 多个GPU设置 深度学习 Caffe PyTorch 等
  20. 树莓派呼吸灯python代码

热门文章

  1. C++基础 匿名对象
  2. unittest测试框架详谈及实操(一)
  3. JavaWeb学习--Servlet认识
  4. 华为OSPF多区域+路由重发布/路由引入
  5. web安全day17:天天都在说的中间人攻击到底是啥
  6. TCP的三次握手和四次挥手(超详解)
  7. Linux之squirrelmail小松鼠客户端搭建
  8. Sublime Text3搭建HTML环境
  9. js学习(六)- js对象创建
  10. 苹果iOS系统源码思考:对象的引用计数存储在哪里?--从runtime源码得到的启示...