首页 > 其他分享 >ReentrantLock类

ReentrantLock类

时间:2024-06-09 20:54:50浏览次数:10  
标签:Thread lock ReentrantLock try static 线程 new

ReentrantLock

与synchronized相比有以下特点

  1. 可中断
  2. 可以设置为公平锁
  3. 支持多个条件变量

与sychronized一样的

  1. 支持可重入锁
  2. 可打断锁(避免死锁):使用lockInterruptibly()方法

public class TestReentrant {
    private static ReentrantLock lock=new ReentrantLock();
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            try {
                System.out.println("尝试获取锁");
                //如果没有竞争此方法会获取锁
                //有竞争则进入阻塞队列,可以被其他线程用interrupt方法打断
                lock.lockInterruptibly();
            } catch (InterruptedException i) {
                System.out.println("没有获取到锁");
                i.printStackTrace();
                return;
            }
            try {
                System.out.println("获取锁成功");
            } finally {
                lock.unlock();
            }
        });
        lock.lock();
        thread.start();	//主线程拿走锁,使thread线程进入阻塞状态
//        thread.interrupt();	//打断该线程避免死锁
    }
}

锁超时

  1. 设置锁超时
reentrantLock.tryLock(2, TimeUnit.SECONDS)//尝试获取锁获取锁成功返回true,失败返回false
reentrantLock.unLock();//该方法调用必须放在finally

条件变量:

可以创建多个,让某个线程进入该条件变量等待。唤醒时可以指定唤醒某个线程

Condition condition = lock.newCondition();  //创建一个条件变量,让某个线程在这里等待
Condition condition1 = lock.newCondition();
 try {
 	condition.await();  //让线程进入等待
   condition.signal(); //唤醒该条件变量中某个线程
   condition.signalAll();//唤醒该条件变量中的全部线程
} catch (InterruptedException e) {
   throw new RuntimeException(e);
} 

结合上面写个案例


package devise;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

/**
 *
 * 小明没烟,要抽烟才能干活
 * 小红饿了,要吃外卖才能干活。
 * 但是在同一个房间休息小明抽烟会有烟味,小红吃不下。
 * 所以分了两房间
 * 
 */

public class TestCorrectPostureStep {

    static ReentrantLock lock=new ReentrantLock();
    static Condition c1=lock.newCondition();//房间c1
    static Condition c2=lock.newCondition();//房间c2
    static boolean cigarette =false;
    static boolean takeout =false;

    public static void main(String[] args){
        //小明
        Thread t1=new Thread(()->{
            lock.lock();
            try {
                while (!cigarette){
                    System.out.println("烟没到休息一会");
                    try {
                        c1.await(); //让小明到c1休息室休息
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
                System.out.println("烟到了,开始干活");
            } finally {
                lock.unlock();
            }
        });
        //小红
        Thread t2 =new Thread(()->{
            lock.lock();
            try {
                while (!takeout){
                    System.out.println("外卖没到休息一会");
                    try {
                        c2.await();//让小红到c2休息室休息
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
                System.out.println("外卖到了,开始干活");
            }finally {
                lock.unlock();
            }
        });

        //送外卖线程
        Thread t3=new Thread(()->{
            lock.lock();
            try {
                Thread.sleep(2000);
                cigarette=true;
                c1.signal();//唤醒小红让小明干活
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }finally {
                lock.unlock();
            }
        }); 
        //送烟线程
        Thread t4=new Thread(()->{
            lock.lock();
            try {
                Thread.sleep(2000);
                takeout=true;
                c2.signal(); //唤醒小明让小明干活
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }finally {
                lock.unlock();
            }
        });

        t1.start();
        t2.start();
        t3.start();
        t4.start();

    }}

标签:Thread,lock,ReentrantLock,try,static,线程,new
From: https://www.cnblogs.com/csm233/p/18239989

相关文章

  • 【AQS与ReentrantLock】剖析AQS与ReentrantLock底层源码,实现一个属于你的锁
    AQS引言在多线程高并发场景下,我们为了保证操作的原子性,必要的需要对代码块进行线程同步。我们知道ReentrantLock可以在Java中实现公平锁和非公平锁,它是类层面实现的锁,可以起到像sychronized关键字那样的同步功能,那么它是如何做到的呢?为了深入了解ReentrantLock的实现,那......
  • Java-并发-ReentrantLock
    0.是什么ReentrantLock是java.util.concurrent.locks包中的一个类,提供了比synchronized关键字更灵活和强大的锁机制。ReentrantLock实现了Lock接口,它允许显式地加锁和解锁,并提供了一些高级功能,如中断锁请求、超时锁请求、公平锁和非公平锁选择等。1.为什么在Java诞生......
  • ReentrantLock分为公平锁和非公平锁,那底层分别是如何实现的
    ReentrantLock在Java中是通过AbstractQueuedSynchronizer(AQS)框架实现的,它提供了公平锁(FairSync)和非公平锁(NonfairSync)两种模式。这两种锁的实现主要区别在于获取锁的策略。importjava.util.concurrent.locks.ReentrantLock;publicclassReentrantLockDemo{//非公平......
  • ReentrantLock分为公平锁和非公平锁,那底层分别是如何实现的
    ReentrantLock在Java中是通过AbstractQueuedSynchronizer(AQS)框架实现的,它提供了公平锁(FairSync)和非公平锁(NonfairSync)两种模式。这两种锁的实现主要区别在于获取锁的策略。importjava.util.concurrent.locks.ReentrantLock;publicclassReentrantLockDemo{//非公平......
  • HarmonyOS中实现 非可重入锁 NonReentrantLock
    背景在多线程编程中,确保资源的互斥访问是至关重要的。允许并行执行,但需要同步机制来避免数据竞争和竞态条件。锁的重要性锁是一种同步机制,用于控制对共享资源的访问。在ArkTs中,传统的锁实现依赖于语言级别的原子操作,但随着共享内存的引入,我们需要一种新的同步机制。使用Shared......
  • 并发编程(ReentrantLock)
    ReentrantLock是独占锁,每次只能有一个线程能获取到锁(支持重入)。其他未获取锁的线程会放入的CLH队列中,等待当前线程唤醒;主要分为公平锁和非公平锁,由内部类FairSync和NoFairSync来实现。主要的区别在于非公平锁每次都会尝试竞争,竞争不到锁才会放入到CLH队列中NonfairSync类......
  • 从源码入手详解ReentrantLock,一个比synchronized更强大的可重入锁
    写在开头随手一翻,发现对于Java中并发多线程的学习已经发布了十几篇博客了,多线程是Java基础中的重中之重!因此,可能还需要十几篇博客才能大致的讲完这部分的知识点,初学者对于这部分内容一定要多花心思,不可马虎!今天我们继续来学习一个重要知识点:ReentrantLockReentrantLock:是一种......
  • 27.ReentrantLock
    1.与synchronized不同点:可中断可以设置超时时间可以设置公平锁,公平锁就是为了解决饥饿线程,让线程排队,先进先出,先来的线程先执行。支持多个条件变量2.与synchronized相同点都支持锁的可重入。基本格式://获取锁reentrantLock.lock();try{}finally{//必须释放锁......
  • ReentrantLock 原理
    (一)、非公平锁实现原理1、加锁解锁流程先从构造器开始看,默认为非公平锁实现publicReentrantLock(){sync=newNonfairSync();}NonfairSync继承自AQS没有竞争时加锁流程构造器构造,默认构造非公平锁(无竞争,第一个线程尝试加锁时)加锁,luck(),finalvoidlo......
  • sychronized和ReentrantLock对比
    共同点①都用于多线程对共享对象的访问。②都是可重入锁。③都保证了可见性和互斥性。不同点①ReentrantLock显示获取和释放锁;synchronized隐式获取和释放锁。②Reentrant可响应中断、可轮询,为处理锁提供了更强的灵活性。③ReentrantLock是API级别的,synchronized是JVM级......