Java 锁Lock实例使用 绝地灬酷狼 2022-11-27 00:38 101阅读 0赞 Java 锁Lock实例使用 synchronized和Lock区别: synchronized: (如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,并执行该代码块时,其他线程便只能一直等待,等待获取锁的线程释放锁) 获取锁的线程释放锁情况: 1、获取锁的线程执行完了该代码块,然后线程释放对锁的占有。 2、线程执行发生异常,此时JVM会让线程自动释放锁。 3、这个主要是在等待唤醒机制里面的wait()方法,在等待的时候立即释放锁,方便其他的线程使用锁。而且被唤醒时,就在此处唤醒。 虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁,同时为了更好地释放锁。 锁对象Lock: (通过Lock可以知道线程有没有成功获取到锁。这个是synchronized无法办到的) 1、Lock不是Java语言内置的,synchronized是Java语言的关键字,因此是内置特性。Lock是一个类,通过这个类可以实现同步访问。 2、synchronized是在JVM层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定,但是使用Lock则不行,lock是通过代码实现的,要保证锁定一定会被释放,就必须将unLock()放到finally\{\}中。 3、在资源竞争不是很激烈的情况下,synchronized的性能要优于ReetrantLock,但是在资源竞争很激烈的情况下,synchronized的性能会下降几十倍。 Lock使用简单示例:(卖火车票例子) package code; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * * sellTicket.java * @author 董欣欣 * @date 2017年4月9日 上午8:55:04 */ public class sellTicket implements Runnable{ private static int num=30; private Lock lock=new ReentrantLock(); @Override public void run() { // TODO Auto-generated method stub while(num>0){ try{ lock.lock(); if(num>0){ try { Thread.sleep(500); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"正在出售"+num--); } }finally{ lock.unlock(); } } } } package code; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * * sellTicket.java * @author 董欣欣 * @date 2017年4月9日 上午8:55:04 */ public class sellTicket implements Runnable{ private static int num=30; private Lock lock=new ReentrantLock(); @Override public void run() { // TODO Auto-generated method stub while(num>0){ try{ lock.lock(); if(num>0){ try { Thread.sleep(500); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"正在出售"+num--); } }finally{ lock.unlock(); } } } } 测试方法: public static void main(String args[]) { sellTicket str = new sellTicket(); Thread tr1 = new Thread(str, "窗口1"); Thread tr2 = new Thread(str, "窗口2"); Thread tr3 = new Thread(str, "窗口3"); tr1.start(); tr2.start(); tr3.start(); } public static void main(String args[]) { sellTicket str = new sellTicket(); Thread tr1 = new Thread(str, "窗口1"); Thread tr2 = new Thread(str, "窗口2"); Thread tr3 = new Thread(str, "窗口3"); tr1.start(); tr2.start(); tr3.start(); }
相关 Java并发编程:Lock接口及死锁问题实例 在Java的并发编程中,`Lock`接口是线程安全的关键。`Lock`提供了可重入、公平性等特性。 以下是一些关于`Lock`接口的基本概念和实例: 1. **内置锁:** 深碍√TFBOYSˉ_/ 2024年09月10日 08:03/ 0 赞/ 13 阅读
相关 Lock锁的使用 Java多线程中,可以使用synchronized关键字实现线程之间的同步互斥,在jdk1.5后新增的ReentrantLock类同样可达到此效果,且在使用上比synch... r囧r小猫/ 2024年04月17日 05:26/ 0 赞/ 26 阅读
相关 Java Lock锁使用场景 叙述 提到锁,就会想到数据库锁、Java内置锁、分布式锁 使用场景 首先,需要加锁的资源一定是临界资源,所谓临界资源就是在多线程的情况下,各个线程会进行抢占的资源 淡淡的烟草味﹌/ 2024年03月24日 14:03/ 0 赞/ 23 阅读
相关 Java 锁Lock实例使用 Java 锁Lock实例使用 synchronized和Lock区别: synchronized: (如果一个代码块被synchronized修饰了,当一个线程获取了对 绝地灬酷狼/ 2022年11月27日 00:38/ 0 赞/ 102 阅读
相关 锁+LOCK --锁 总结 锁(LOCKING) 是最常用的并发控制机构。是防止其他事务访问指定的资源控制、实现并发控制的一种主要手段。锁是事务对某个数据库中的 绝地灬酷狼/ 2022年06月18日 00:06/ 0 赞/ 184 阅读
相关 [java]lock锁介绍 以下是本文目录大纲: 一.synchronized的缺陷 二.java.util.concurrent.locks包下常用的类 三.锁的相关概念介绍 ╰半橙微兮°/ 2022年04月02日 14:16/ 0 赞/ 274 阅读
相关 Java多线程-Lock锁的使用 文章目录 Lock锁的使用 一 Lock接口 1.1 Lock接口简介 1.2 Lock的简单使用 た 入场券/ 2022年03月08日 14:26/ 0 赞/ 284 阅读
相关 Hibernate乐观锁(optimistic lock)实例详解 相对于悲观锁而言,乐观锁(optimistic lock)通常认为多个事务同时操作同一数据的情况很少发生,因此乐观锁不进行数据库层次上的锁定,而是基于数据版本(Versi... 朱雀/ 2021年01月14日 04:58/ 0 赞/ 1524 阅读
相关 Hibernate悲观锁(pessimistic lock)实例详解 悲观锁(pessimistic lock)是指在每次操作数据时,总是悲观地认为会有其他事务操作同一数据,因此,在整个数据处理过程中,会把数据处于锁定状态。 悲观锁具有排... 朱雀/ 2021年01月14日 04:55/ 0 赞/ 1838 阅读
还没有评论,来说两句吧...