Lock锁

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

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

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

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

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

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

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

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

lock.lock();

获得锁。如果锁不可用,那么为了线程调度目的,当前线程将被禁用,并处于休眠状态,直到获得锁。

实现注意事项Lock实现可以检测对锁的错误使用

例如可能导致死锁的调用,并可能在这种情况下抛出(未检查的)异常。环境和异常类型必须由该Lock实现记录。

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class lockTest {public static void main(String[] args) {Ticket ticket = new Ticket();new Thread(() -> {for (int i = 0; i < 40; i++) {ticket.sale(i);}}, "a").start();new Thread(() -> {for (int i = 0; i < 40; i++) {ticket.sale(i);}}, "b").start();new Thread(() -> {for (int i = 0; i < 40; i++) {ticket.sale(i);}}, "c").start();}
}class Ticket {private int ticketNum = 30;private final Lock lock = new ReentrantLock();public void sale(int i) {lock.lock();try {if (this.ticketNum > 0) {System.out.println(Thread.currentThread().getName() + i + "-->购得第" + ticketNum-- + "张票, 剩余" + ticketNum + "张票");} else {System.out.println(Thread.currentThread().getName() + i + "-->没买到票,剩余" + ticketNum + "张票");}//睡眠一秒,增加错误的发生几率TimeUnit.SECONDS.sleep(1);} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}
}

执行结果:

a0–>购得第30张票, 剩余29张票
a1–>购得第29张票, 剩余28张票
a2–>购得第28张票, 剩余27张票
a3–>购得第27张票, 剩余26张票
a4–>购得第26张票, 剩余25张票
a5–>购得第25张票, 剩余24张票
a6–>购得第24张票, 剩余23张票
a7–>购得第23张票, 剩余22张票
a8–>购得第22张票, 剩余21张票
b0–>购得第21张票, 剩余20张票
b1–>购得第20张票, 剩余19张票
b2–>购得第19张票, 剩余18张票
b3–>购得第18张票, 剩余17张票
c0–>购得第17张票, 剩余16张票
a9–>购得第16张票, 剩余15张票
a10–>购得第15张票, 剩余14张票
a11–>购得第14张票, 剩余13张票
a12–>购得第13张票, 剩余12张票
a13–>购得第12张票, 剩余11张票
a14–>购得第11张票, 剩余10张票
a15–>购得第10张票, 剩余9张票
a16–>购得第9张票, 剩余8张票
a17–>购得第8张票, 剩余7张票
a18–>购得第7张票, 剩余6张票
a19–>购得第6张票, 剩余5张票
a20–>购得第5张票, 剩余4张票
a21–>购得第4张票, 剩余3张票
a22–>购得第3张票, 剩余2张票
a23–>购得第2张票, 剩余1张票
b4–>购得第1张票, 剩余0张票
c1–>没买到票,剩余0张票
a24–>没买到票,剩余0张票
a25–>没买到票,剩余0张票
a26–>没买到票,剩余0张票
a27–>没买到票,剩余0张票

lock.lock()使用,与synchronized对比相关推荐

  1. java 同步 lock_关于java:同步是否像Lock.lock()一样驻留并发线程?

    当我们调用lock.lock()或尝试输入synchronized块时,如果其他某个线程已经获得了该锁,则我们的线程将阻塞. 现在我的问题是,当我们查看lock.lock()的实现时,它会将获取锁委托 ...

  2. JUC里面的相关分类|| java并发编程中,关于锁的实现方式有两种synchronized ,Lock || Lock——ReentrantLock||AQS(抽象队列同步器)

    JUC分类 java并发编程中,关于锁的实现方式有两种synchronized ,Lock AQS--AbstractQueuedSynchronizer

  3. Python的Lock对象和Condition对象对比

    Lock对象: import threading import time class myThread(threading.Thread):def __init__(self):threading.T ...

  4. 线程锁--普通锁 Lock lock = new ReentrantLock();

    https://blog.csdn.net/u014236541/article/details/50301163

  5. 【重难点】【JUC 04】synchronized 原理、ReentrantLock 原理、synchronized 和 Lock 的对比、CAS 无锁原理

    [重难点][JUC 04]synchronized 原理.ReentrantLock 原理.synchronized 和 Lock 的对比.CAS 无锁原理 文章目录 [重难点][JUC 04]syn ...

  6. synchronized与(ReentrantLock)Lock的对比区别

    类别 synchronized Lock 存在层次 Java关键字,属于原生语法层面 需要jvm实现 而Lock它是JDK 1.5之后提供的API层面的互斥锁,需要lock()和unlock()方法配 ...

  7. synchronized与Lock的区别与使用

    原文链接 https://blog.csdn.net/u012403290/article/details/64910926 ###引言: 昨天在学习别人分享的面试经验时,看到Lock的使用.想起自己 ...

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

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

  9. Lock接口Condition,以及Lock与synchronized异同

    一.synchronized与Lock 基于synchronized关键字去实现同步的,(jvm内置锁,也叫隐式锁,由我们的jvm自动去加锁跟解锁的)juc下的基于Lock接口的这样的一种锁的实现方式 ...

  10. Java培训教程之使用Lock取代synchronized

    在多线程中,1.5版本之前,我们都使用同步代码块或者同步方法来解决线程安全问题 比如: 同步代码块 synchronized(锁对象){ 功能代码; } 同步方法 public synchronize ...

最新文章

  1. 重磅直播|结构光之相移法+格雷码技术详解
  2. 2018-2019年新一代AI领域十大最具成长性技术展望
  3. 二十一、Python中的Scipy统计库
  4. HDU Problem - 4289 Control(最大流)
  5. hive 运行命令后FAILED: Execution Error, return code 137 from org.apache.hadoop.hive.ql.ex ec.mr.MapredLoc
  6. fprintf函数的用法matlab_极力推荐这个Matlab教程
  7. PhantomJS的使用
  8. 植物大战僵尸全明星服务器维修多长时间,植物大战僵尸全明星常见问题FAQ详解...
  9. 电磁场边界条件方程汇总及简单记忆方法
  10. android通知栏内添加快捷键_Android实现向Launcher添加快捷方式的方法
  11. HDU - 5950 Recursive sequence(矩阵快速幂)
  12. Android 动态权限申请
  13. 一万年太久,只争朝夕,男儿有泪不轻弹,只是未到伤心处!!!!!!
  14. 大调查:2018中国程序员真实薪资曝光,看看你达到平均水平了吗?
  15. 计划任务linux每天执行一次,linux 每天执行任务计划
  16. A19-Python基础之lambda匿名函数-过滤器-映射
  17. 宁波一货船在东海海域沉没
  18. 【历史上的今天】8 月 9 日:人工智能理论的奠基者诞生;鸿蒙 OS 发布;“云计算”概念被提出
  19. ZLMediaKit视频推流和播放步骤
  20. 每日一题 笨拙的手指

热门文章

  1. [JLOI2015]城池攻占 左偏树
  2. 自己的包增加为第三方包,使用Eclipse环境报Unresolved import错误(pycharm可用正常引用)...
  3. EF并非我们想象的那么智能
  4. Swift之 ? 和 !
  5. 安装360后,visual studio 经常报各种莫名其妙的错误的解决方案
  6. 数据挖掘方法论流程图
  7. hdu 1394 Minimum Inversion Number
  8. PostgreSQL在何处处理 sql查询之五十三
  9. VS2008(C#)制作网页Tab标签切换方法(四)
  10. CICD详解(七)——git、gitlab与github