简单看看LockSupport和AQS

这次我们可以看看并发中锁的原理,大概会说到AQS,ReentrantLock,ReentrantReadWriteLock以及JDK8中新增的StampedLock,这些都是在java并发中很重要的东西,慢慢看吧!

 

一.LockSupport工具类

  LockSupport工具类是jdk中rt.jar里面的,主要作用是挂起和唤醒线程,该类是创建锁和创建其他同步类的基础。还有我们要知道,LockSupport这个类是以Unsafe这个类为基础,讲过前面简单的看了看Unsafe,是不是觉得还是比较熟悉的吧!

  我们先看看LockSupport的park(英文翻译:停下,坐下)和unpark(英文翻译:唤醒,启动)方法,注意,这两个方法和wait和notify功能很像,但是在这里我更喜欢叫做授权

  简单的看一个例子:

package com.example.demo.study;
import java.util.concurrent.locks.LockSupport;

public class Study0130 {

    public static void main(String[] args) {
        System.out.println("main begin");                
        LockSupport.park();       
        System.out.println("main end");
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: LockSupport.park()和条件变量都是Java中用于线程同步的机制,但是它们有一些不同点。 LockSupport.park()是一个底层的线程阻塞工具,它可以让线程处于等待状态,直到另一个线程调用unpark()方法唤醒它。LockSupport.park()和unpark()方法可以用于实现高级同步工具,如ReentrantLock、Semaphore等。 条件变量是基于锁的高级同步工具,与LockSupport.park()不同的是,条件变量可以提供更丰富的同步语义。条件变量通常与锁一起使用,当某个线程需要等待某个条件满足时,它会释放锁并进入等待状态,当另一个线程满足条件时,它会通知条件变量,从而唤醒等待的线程。条件变量的实现可以使用Object.wait()和Object.notify()方法,但是使用条件变量可以更加简洁和安全。 总的来说,LockSupport.park()适用于更底层和高级的同步需求,而条件变量适用于更高级和丰富的同步需求。 ### 回答2: LockSupport.park()和条件变量是两种不同的线程同步机制。 LockSupport.park()是Java并发包中的一个工具类,用于实现线程的阻塞和唤醒。调用LockSupport.park()方法可以使当前线程进入阻塞状态,而调用LockSupport.unpark()方法可以释放线程的阻塞状态。与其他同步机制不同的是,LockSupport.park()和LockSupport.unpark()并没有对应的锁对象,因此可以随意进行调用,而不需要在某个特定的锁上进行等待或唤醒操作。这使得LockSupport.park()和LockSupport.unpark()可以更加灵活地进行线程的阻塞和唤醒操作,而不会受到特定锁的限制。 条件变量是一种线程同步的机制,它允许线程在满足特定条件之前进行阻塞,并且在条件满足时被唤醒。条件变量通常与互斥锁配合使用,在互斥锁上对条件进行等待和唤醒操作。当某个线程获取到互斥锁后,发现条件不满足时,可以调用条件变量的等待方法将自己阻塞住,并且释放对互斥锁的持有。其他线程在满足条件时可以通过唤醒方法来唤醒等待的线程,使其重新竞争互斥锁。 LockSupport.park()和条件变量在实现的方式上有所不同。LockSupport.park()是通过调用底层操作系统提供的线程阻塞原语来实现的,而条件变量则是通过在用户态进行等待和唤醒操作来实现的。此外,LockSupport.park()更加的灵活,不需要在特定的锁上进行等待或唤醒操作,而条件变量需要依赖于互斥锁。因此,在选择使用哪一种线程同步机制时,可以根据具体的场景需求和性能要求来进行选择。 ### 回答3: LockSupport.park()和条件变量都是Java中用于线程同步的机制,但它们有一些区别。 LockSupport.park()是一个基于线程的阻塞方法,调用该方法将导致当前线程进入阻塞状态,直到满足某个条件才能继续执行。它不依赖于任何锁对象,可以直接调用。与传统的锁机制相比,它更加灵活,不需要获取锁就能进行阻塞和唤醒操作。通常,我们可以通过调用LockSupport.unpark()方法来唤醒被park()阻塞的线程。但需要注意的是,unpark()方法只是给线程一个许可,线程不会保证立即从park()方法返回,因此,必要时我们需要通过其他方式确保条件满足后的唤醒。 而条件变量是基于锁的一个高级概念,它是指一个对象的状态依赖于某个条件的一种机制。通过显式地调用锁对象的wait()方法来进行等待,而该对象的状态由其他线程通过锁对象的notify()或notifyAll()方法来改变。条件变量的使用必须搭配锁对象,一般是使用ReentrantLock来实现。与LockSupport相比,条件变量的使用方式更加繁琐,需要先获取锁对象才能调用wait()和notify()等方法。 总结起来,LockSupport.park()和条件变量都是用于线程同步的机制,但前者更加灵活简洁,不依赖于特定的锁对象,可以直接进行阻塞和唤醒操作;后者是基于锁的高级概念,需要搭配锁对象使用,通过wait()和notify()等方法来实现条件的等待和改变。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值