首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

LockSupport和AbstractQueuedSynchronizer的任何实际例子都使用?

LockSupport和AbstractQueuedSynchronizer是Java并发编程中的两个重要类。

LockSupport是一个线程阻塞工具类,可以用来实现线程的挂起和唤醒操作。它通过让线程获取或释放许可证来实现线程的阻塞和唤醒。LockSupport类提供了park()和unpark()方法来实现线程的阻塞和唤醒操作。

一个实际的例子是使用LockSupport实现线程的暂停和恢复。下面是一个简单的示例代码:

代码语言:java
复制
import java.util.concurrent.locks.LockSupport;

public class ThreadPauseResumeExample {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            System.out.println("Thread started");
            
            // 暂停线程
            LockSupport.park();
            
            System.out.println("Thread resumed");
        });
        
        thread.start();
        
        // 主线程休眠1秒钟
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        // 恢复线程
        LockSupport.unpark(thread);
    }
}

在上面的例子中,我们创建了一个新的线程,并在该线程中使用LockSupport.park()方法暂停线程。然后,主线程休眠1秒钟后,使用LockSupport.unpark()方法恢复线程的执行。

AbstractQueuedSynchronizer(简称AQS)是一个用于构建锁和同步器的框架类。它提供了一种基于FIFO等待队列的同步机制,可以用来实现独占锁和共享锁等各种同步器。

一个实际的例子是使用AbstractQueuedSynchronizer实现一个简单的独占锁。下面是一个简单的示例代码:

代码语言:java
复制
import java.util.concurrent.locks.AbstractQueuedSynchronizer;

public class SimpleExclusiveLock {
    private static class Sync extends AbstractQueuedSynchronizer {
        @Override
        protected boolean tryAcquire(int arg) {
            if (compareAndSetState(0, 1)) {
                setExclusiveOwnerThread(Thread.currentThread());
                return true;
            }
            return false;
        }
        
        @Override
        protected boolean tryRelease(int arg) {
            if (getState() == 0) {
                throw new IllegalMonitorStateException();
            }
            setExclusiveOwnerThread(null);
            setState(0);
            return true;
        }
        
        @Override
        protected boolean isHeldExclusively() {
            return getState() == 1;
        }
    }
    
    private final Sync sync = new Sync();
    
    public void lock() {
        sync.acquire(1);
    }
    
    public void unlock() {
        sync.release(1);
    }
    
    public boolean isLocked() {
        return sync.isHeldExclusively();
    }
}

在上面的例子中,我们通过继承AbstractQueuedSynchronizer类并重写其中的方法来实现一个简单的独占锁。通过调用acquire()方法获取锁,调用release()方法释放锁,调用isHeldExclusively()方法判断锁是否被当前线程持有。

这些是LockSupport和AbstractQueuedSynchronizer的两个实际例子。它们在Java并发编程中扮演着重要的角色,可以用于实现线程的挂起和唤醒以及构建各种同步器。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

理解Java高级并发工具类LockSupport

LockSupport是并发工具包中一个辅助类,在直接开发过程中很少直接使用,但是它身影已经遍布各种工具类,众所周知,AbstractQueuedSynchronizer简称(AQS)是Java并发包基石之一...辅助构建,而在AbstractQueuedSynchronizer类中却大量采用了LockSupport来操作各种锁状态,所以我们很有必要来了解学习这个类。...(四)使用例子 关于parkunpark一般都是成对出现,下面看一个oracle官网给使用LockSupport一个公平队列锁代码: private final AtomicBoolean...,如果有人占用则进入BLOCKED阻塞 (4)LockSupport类一般不会直接出现在代码里,绝大多数时候我们只需要使用AbstractQueuedSynchronizer这个封装好工具框架类即可。...总结: 本文详细介绍了LockSupport工具类方法api功能说明,并且分析了该类相关注意事项问题,由于该类是AQS框架一个重要组成部分,所以我们很有必要去清晰掌握和了解它。

76420

AQS

因此,使用许可控制线程行为排队玩摩天轮差不多就是一个意思了。 排他锁共享锁 第二个重要概念就是排他锁(exclusive)共享锁(shared)。...而共享锁,就是玩耍摩天轮正常打开方式了。 LockSupport LockSupport可以理解为一个工具类。它作用很简单,就是挂起继续执行线程。...这个写法上面的park()示例非常接近,但是运行结果却是截然不同。在这里,当前线程就是卡死。 因此,使用park()unpark()才是我们首选。...而在AbstractQueuedSynchronizer中,也正是使用LockSupportpark()unpark()操作来控制线程运行状态。...实际上,每个条件变量对象内部维护了一个等待列表。其逻辑结构如下所示: ? 下面的类图展示了代码层面的具体实现: ?

44120

Java中可重入锁ReentrantLock原理剖析

AbstractQueuedSynchronizer是一个模板类,它实现了许多锁相关功能,并提供了钩子方法供用户实现,比如tryAcquire,tryRelease等。...2、当我们调用ReentrantLocklock方法时候,实际上是调用了NonfairSynclock方法,这个方法先用CAS操作,去尝试抢占该锁。...3、调用acquire(1)实际使用AbstractQueuedSynchronizeracquire方法,它是一套锁抢占模板,总体原理是先去尝试获取锁,如果没有获取成功,就在CLH队列中增加一个当前线程节点...四、 公平锁非公平锁区别 公平锁非公平锁,在CHL队列抢占模式上都是一致,也就是在进入acquireQueued这个方法之后一样,它们区别在初次抢占上有区别,也就是tryAcquire上区别...在基于CHL队列锁竞争中,依靠CAS操作保证原子操作,依靠LockSupport来做线程挂起唤醒,使用队列来保证并发执行变成了串行执行,从而消除了并发所带来问题。

60220

CPU占用100%排查过程

2、top -p 15913 -H 加上 -H 选项可以该进程相关线程信息,从下图种可知最耗CPU两个线程PID分别是 1592415925,对应16进制为 0x3e340x3e35 ?...jstack.log完整内容在文章最后贴出。 在日志最后面找到了0x3e340x3e35,对应是GC线程,由此猜想可能是不停GC导致CPU占用过高。...S0:S0使用率; S1:S1使用率; E:Eden使用率; O:老年代使用率; P:PermGen内存使用百分比; M:MetaSpace内存使用百分比; YGC:Minor GC总共次数; YGCT...内存使用率太高,猜测可能是因为为JVM分配内存太小了 5、jmap -heap 15193 以上命令用于查看java进程JVM内存情况 ?...最大内存为948MB,老年代632MB,使用率已经无线接近100%。

4.7K21

Java并发编程实战系列14之构建自定义同步工具 (Building Custom Synchronizers)

对象内置锁(intrinsic lock )内置条件队列是关联,要调用X中条件队列任何一个方法,都必须持有对象X上锁。...唤醒后,wait在返回前还需要重新获取锁,当线程从wait方法中唤醒,它在重新请求锁时不具有任何特殊优先级,其他人一起竞争。...因此一旦notify了那么就需要尽快释放锁,否则别人竞争等着拿锁,都会进行blocked状态,而不是线程挂起waiting状态,竞争了不是好事,但是这是你考了性能因素安全性因素一个矛盾,具体问题要具体分析...因此只有满足下面两个条件,才能用notify,而不是notifyAll: 所有等待线程类型相同 单进单出 14.2.5 示例:阀门类A Gate Class 第5章那个TestHarness中使用...举一个例子,一个简单闭锁。

1.2K60

请给出一个MVC模式下用Servletjsp分页HelloWord实际例子

我们不能一下子把所有这些结果列出来,只能一次显示一页。当用户按下一页时候,才会把下一页 内容列出来。这样不至于内存崩溃。要达到这样效果,要用到分页技术。...分页技术核心思想就是把所有的结果放在一个ArrayList的当中(在我们 例子当中就是ArrayList ret)。...连同相关参数比如一共有多少行(totalNumberOfRowsInDB),每页有多少行(pageSize),当 前显示是第几页(currentPageNumber),一共有多少页(totalNumberOfPages),放在...注意这里数据库每行数据都对应一个RegisterRow实例。把 所有这些实例放在ArrayList当中。...当然,为简单起见,我们例子是把所有符合条件数据都给取出来。

34420

【Java并发编程实战14】构建自定义同步工具(Building-Custom-Synchronizers)

对象内置锁(intrinsic lock )内置条件队列是关联,要调用X中条件队列任何一个方法,都必须持有对象X上锁。...唤醒后,wait在返回前还需要重新获取锁,当线程从wait方法中唤醒,它在重新请求锁时不具有任何特殊优先级,其他人一起竞争。...因此一旦notify了那么就需要尽快释放锁,否则别人竞争等着拿锁,都会进行blocked状态,而不是线程挂起waiting状态,竞争了不是好事,但是这是你考了性能因素安全性因素一个矛盾,具体问题要具体分析...因此只有满足下面两个条件,才能用notify,而不是notifyAll: 所有等待线程类型相同 单进单出 2.5 示例:阀门类A Gate Class 第5章那个TestHarness中使用CountDownLatch...阻塞唤醒线程 一个有序队列 1 状态位原子操作 这里使用一个32位整数来描述状态位,前面章节原子操作理论知识整好派上用场,在这里依然使用CAS操作来解决这个问题。

41110

​AQS中公平锁与非公平锁,Condtion

我们先来看看 Condition 使用场景,Condition 经常可以用在生产者-消费者场景中,请看 Doug Lea 给出这个例子: import java.util.concurrent.locks.Condition...,实际生产中可以直接使用 ArrayBlockingQueue) 我们常用 obj.wait(),obj.notify() 或 obj.notifyAll() 来实现相似的功能,但是,它们是基于对象监视器锁...这里阻塞队列如果叫做同步队列(sync queue)其实比较贴切,不过为了前篇呼应,我就继续使用阻塞队列了。记住这里两个概念,阻塞队列条件队列。 ?...有没有被骗感觉,我说了一大堆,可是取消没有任何关系啊。...在并发包中,有非常多这种处理中断例子,提供两个方法,分别为响应中断不响应中断,对于不响应中断方法,记录中断而不是丢失这个信息。

64621

线程阻塞唤醒

LockSupport可以对Unsafeparkunpark调用设置parkBlocker属性。 Java锁数据结构是通过调用LockSupport来实现休眠唤醒。...AbstractQueuedSynchronizer AbstractQueuedSynchronizer类是一个抽象类,所有的锁队列管理父类,JDK中各种形式锁内部队列继承这个类,是Java并发世界基石...Java中并发工具类需要进行一些方法抽象,需要对这个管理器进行定制,并发数据结构都是在这些锁保护下完成。...可以引入signal()await()方法,当条件满足时,调用signal()或者signalAll()方法,阻塞线程可以立即被唤醒几乎没有任何延迟。...AQS队列管理为解决多线程并发,在代码中会使用CAS操作队尾指针,没有竞争到线程会继续下一轮竞争。

1.5K30

JVM之jstack使用和解析

由于程序是正常运行,没有任何输出,从日志方面也看不出什么问题,所以就需要看下jvm内部线程执行情况,然后再进行分析查找出原因。...jstack是jdk自带线程堆栈分析工具,使用该命令可以查看或导出 java 应用程序中线程堆栈信息。 jstack用于生成java虚拟机当前时刻线程快照。...如果java程序崩溃生成core文件,jstack工具可以用来获得core文件java stacknative stack信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。...另外,jstack工具还可以附属到正在运行java程序中,看到当时运行java程序java stacknative stack信息, 如果现在运行java程序呈现hung状态,jstack...-l 打印关于锁其他信息,比如拥有的java.util.concurrent ownable同步器列表。 -m 打印包含Java本机C/ C++帧混合模式堆栈跟踪。

1.2K20

死磕 java同步系列之ReentrantLock源码解析(二)——条件锁

在java中,条件锁实现都在AQSConditionObject类中,ConditionObject实现了Condition接口,下面我们通过一个例子来进入到条件锁学习中。...找到了也说明已经在AQS队列中了 return findNodeFromTail(node);} 这里有几个难理解点: (1)Condition队列AQS队列不完全一样; AQS队列头节点是不存在任何...还记得开头例子吗?...notEmpty上; (7)ReentrantLock中条件锁是通过AQSConditionObject内部类实现; (8)await()signal()方法都必须在获取锁之后释放锁之前使用;...彩蛋 为什么java有自带关键字synchronized了还需要实现一个ReentrantLock呢? 首先,它们都是可重入锁; 其次,它们默认是非公平模式; 然后,...

45520

JAVA-LOCK之底层实现原理(源码分析)

首先Synchronized(可以参考) 不同之处,Lock完全用Java写成,在java这个层面是无关JVM实现。...其实现依赖java.util.concurrent.AbstractQueuedSynchronizer类,简称AQS。 ?...简单说来,AbstractQueuedSynchronizer会把所有的请求线程构成一个CLH队列,当一个线程执行完毕(lock.unlock())时会激活自己后继节点,但正在执行线程并不在队列中,...而那些等待执行线程全部处于阻塞状态,线程显式阻塞是通过调用LockSupport.park()完成,而LockSupport.park()则调用sun.misc.Unsafe.park()本地方法,...解锁代码相对简单,主要体现在AbstractQueuedSynchronizer.releaseSync.tryRelease方法中class AbstractQueuedSynchronizer public

1.7K20
领券