Lock 接口的简单使用 朱雀 2023-07-03 04:42 123阅读 0赞 ### 文章目录 ### * 什么是 Lock? * 锁和同步块之间的区别? * Lock 的定义 * Lock 中的方法 * * lock() * lockInterruptibly() * tryLock() * tryLock(long time,TimeUnit unit) * unlock() * 举例:(Lock 的使用) # 什么是 Lock? # Lock 的中文意思指的是锁,Lock 是 java.util.concurrent.locks 包下的一个接口,该接口作用于线程同步机制,类似同步块。新的锁定机制更加灵活,提供比同步块更多的选项。 # 锁和同步块之间的区别? # 锁和同步块之间的主要区别如下: * 序列的保证:同步块不提供对等待线程进行访问的序列的任何保证,但 Lock 接口处理它 * 无超时:如果未授予锁,则同步块没有超时选项,但 Lock 接口提供了这样的选项 * 单一方法:同步块必须完全包含在单个方法中,而 Lock 接口的方法 lock() 和 unLock() 可以以不同的方式调用 # Lock 的定义 # Lock 的定义如下: public interface Lock # Lock 中的方法 # ## lock() ## 获取锁 如果该锁不可用,则出于线程调度目的,当前线程将被禁用,并处于休眠状态,直到获得该锁为止 void lock() ## lockInterruptibly() ## 说明: * 除非当前线程被中断,否则获取锁。 * 获取锁(如果有)并立即返回。 * 如果该锁不可用,则出于线程调度目的,当前线程将被禁用,并处于休眠状态,直到发生以下两种情况之一: * 该锁由当前线程获取; 要么 其他一些线程中断当前线程,并支持锁定获取的中断。如果当前线程: * 在进入此方法时已设置其中断状态; 要么 获取锁时被中断,并且支持锁获取的中断, 然后抛出InterruptedException并清除当前线程的中断状态。 void lockInterruptibly() throws InterruptedException ## tryLock() ## 仅在调用时释放锁时才获取锁 获取锁(如果有),并立即返回true值 如果锁不可用,则此方法将立即返回false值 boolean tryLock() ## tryLock(long time,TimeUnit unit) ## 如果在给定的等待时间内没有锁,并且当前线程尚未中断,则获取锁。 如果锁可用,则此方法立即返回true值。如果该锁不可用,则出于线程调度目的,当前线程将被禁用,并在发生以下三种情况之一之前处于休眠状态: * 该锁由当前线程获取;要么 * 其他一些线程会中断当前线程,并支持中断获取锁;要么 * 经过指定的等待时间 如果获得了锁,则返回值true。 如果当前线程: * 在进入此方法时已设置其中断状态;要么 * 在获取锁时被中断,并且支持锁获取的中断, 然后抛出InterruptedException并清除当前线程的中断状态。 如果经过了指定的等待时间,则返回值false。如果时间小于或等于零,则该方法将根本不等待。 boolean tryLock(long time,TimeUnit unit) throws InterruptedException ## unlock() ## 释放锁 void unlock() # 举例:(Lock 的使用) # 以下 TestThread 程序演示了使用 Lock 接口的一些方法。 这里我们使用 lock() 获取锁和 unlock() 来释放锁 package com.java.springtest.testdemo; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * @author Woo_home * @create by 2020/2/2 */ public class TestThread { public static void main(String[] args) { PrintThread printThread = new PrintThread(); ThreadDemo threadDemo1 = new ThreadDemo("Thread - 1 ",printThread); ThreadDemo threadDemo2 = new ThreadDemo("Thread - 2 ",printThread); ThreadDemo threadDemo3 = new ThreadDemo("Thread - 3 ",printThread); ThreadDemo threadDemo4 = new ThreadDemo("Thread - 4 ",printThread); ThreadDemo threadDemo5 = new ThreadDemo("Thread - 5 ",printThread); threadDemo1.start(); threadDemo2.start(); threadDemo3.start(); threadDemo4.start(); threadDemo5.start(); } } class PrintThread { private final Lock queueLock = new ReentrantLock(); public void printMessage() { // 加锁 queueLock.lock(); try { Long duration = (long) (Math.random() * 10000); System.out.println(Thread.currentThread().getName() + " Time Taken " + (duration / 1000) + " seconds"); Thread.sleep(duration); } catch (InterruptedException e) { e.printStackTrace(); } finally { System.out.printf("%s printed the successfully.\n",Thread.currentThread().getName()); // 释放锁 queueLock.unlock(); } } } class ThreadDemo extends Thread { private PrintThread printThread; public ThreadDemo(String name, PrintThread printThread) { super(name); this.printThread = printThread; } @Override public void run() { System.out.printf("%s starts printing a document\n",Thread.currentThread().getName()); printThread.printMessage(); } } 输出: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1dvb19ob21l_size_16_color_FFFFFF_t_70] [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1dvb19ob21l_size_16_color_FFFFFF_t_70]: https://img-blog.csdnimg.cn/20200202113834278.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1dvb19ob21l,size_16,color_FFFFFF,t_70
相关 Java并发编程:Lock接口使用示例 在Java的并发编程中,`Lock`接口是JDK提供的一种资源同步方式。它提供了比`Semaphore`更细粒度的锁控制。 下面是一个简单的`Lock`接口使用示例: `` 喜欢ヅ旅行/ 2024年09月11日 21:03/ 0 赞/ 50 阅读
相关 Lock 接口的简单使用 文章目录 什么是 Lock? 锁和同步块之间的区别? Lock 的定义 Lock 中的方法 lock() lockInt 朱雀/ 2023年07月03日 04:42/ 0 赞/ 124 阅读
相关 Lock接口详解 java.util.concurrent.locks包下常用的类与接口(lock是jdk 1.5后新增的) ![watermark_type_ZmFuZ3poZW5naG 偏执的太偏执、/ 2022年12月17日 10:59/ 0 赞/ 188 阅读
相关 使用synchronized实现Lock接口的lock和unlock方法 public class TestLock implements Lock { private Object lock = new Ob 我会带着你远行/ 2022年10月05日 14:50/ 0 赞/ 179 阅读
相关 Lock接口 什么是Lock Lock锁实现提供了比使用同步方法和语句可以获得的更广泛的锁操作。它们允许更灵活的结构,可能具有非常不同的属性,并且可能支持多个关联的条件对象。Lock提 忘是亡心i/ 2022年09月11日 10:29/ 0 赞/ 140 阅读
相关 Lock接口 LOCK接口 1.大多数时候,synchronized来实现同步,但它有一些缺点,为此Java 1.5并发API包ava.util.concurrent,通过LOCK接口来提 深藏阁楼爱情的钟/ 2022年07月20日 15:03/ 0 赞/ 141 阅读
相关 Lock的简单运用 public class Thread13 { public static void main(String[] args) { final Thre Love The Way You Lie/ 2022年06月13日 14:26/ 0 赞/ 186 阅读
相关 Lock接口 锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源。在lock接口出现之前程序是靠synchronized关键字实现锁功能,lock接口提 快来打我*/ 2022年05月19日 11:41/ 0 赞/ 176 阅读
相关 Lock接口与ReentrantLock 锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源(但是有些锁可以允许多个线程并发的访问共享资源,比如读写锁)。 小灰灰/ 2020年05月14日 15:06/ 0 赞/ 839 阅读
还没有评论,来说两句吧...