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

JavaThread.sleep源码分析

但当park方法在阻塞过程,该线程interrupt方法又被调用了,park方法则会提前退出,下次for循环检测到线程状态interrupted,进而返回OS_INTRPT,结束该方法。...比如,在park方法如果检测到_event值不等于0,说明unpark方法被调用过,不用等待了。...如果unpark方法没被调用过,则会进入一般逻辑,即调用pthread_cond_timedwait方法堵塞该线程millis时间。...同样道理,在unpark方法,先检查_event值,如果_event大于等于0,说明park方法没调用过,也就无需执行后面的逻辑了。...如果park方法被调用过,则需要再进一步加锁检查_nParked字段,如果_nParked还是不等于0,说明该线程确实是在堵塞等待过程,调用pthread_cond_signal方法,告诉这个线程,其可以从阻塞状态退出了

75930
您找到你想要的搜索结果了吗?
是的
没有找到

LockSupportpark与unpark原理

JDK中有使用的如下 image.png LockSupport提供是一个许可,如果存在许可,线程在调用park时候,会立马返回,此时许可也会被消费掉,如果没有许可,则会阻塞。...= 0) { //如果线程被中断,或者是在尝试给互斥变量加锁过程,加锁失败,比如被其它线程锁住了,直接返回 return; } //这里表示线程互斥变量锁成功了 int status...Object.wait() */); //将java_suspend_equivalent参数设置true jt->set_suspend_equivalent(); // cleared...,如果超时还没有条件出现,那么重新获取胡吃两然后返回错误码 ETIMEDOUT status = os::Linux::safe_cond_timedwait (_cond, _mutex, &...,阻塞到互斥量被解锁 //park进入wait时,_mutex会被释放 status = pthread_mutex_lock(_mutex); assert (status == 0, "invariant

2.1K41

面试关于多线程同步,你必须要思考问题

Java Lock实现 ReentrantLock是jdk中常用锁实现,其实现逻辑主语基于AQS(juc包大多数同步类实现都是基于AQS);接下来会简单介绍AQS大致原理,关于其实现细节以及各种应用...,调用pthread_cond_timedwait前需要先获得锁,因此park主要流程: 调用pthread_mutex_trylock尝试获得锁,如果获取锁失败直接返回 调用pthread_cond_timedwait...__lock==0将其修改为1并返回0,否则返回1。 如果成功,更改mutexowner当前线程。...,如果integer原始值是0,修改成功,该线程获得锁,否则就将当期线程放入到 wait queue,wait queue线程不会被系统调度(内核态操作)。...在线程被唤醒之后还要在第10步重新获得mutex锁是为了保证锁语义(思考下如果不重新获得mutex锁会发生什么)。

62450

形形色色锁2

不行,因为park方法提供是类似信号量操作,也就是说,如果先unpark,下一次park会立即返回,那么可以理解LockSupport等同于初始值0,最大值1信号量。...但改变信号量和线程阻塞是两个操作,如果要合二一,又要使用锁,这里本身就是要在java层提供一个有别于synchronized锁,总不能再去引用人家吧。..."); } ... }}结论很清楚,最终一步一步调用进入了pthread_cond_wait,也就是利用了linux pthread锁(其他平台版本也有各自实现),进入了阻塞状态,...:对于解释执行,这个插入操作就是去检查当前线程是否处于SafePoint同步状态,如果是就进入阻塞。...,所以CAS成功,栈顶变为B,但实际上B.nextnull,所以此时情况变为:image.png其中堆栈只有B一个元素,C和D组成链表不再存在于堆栈,平白无故就把C、D丢掉了,这是严重逻辑错误

1.5K50

实战之java中线程虚假唤醒

出现虚假唤醒地方 java.lang.Object#wait()方法和它重载方法 java.util.concurrent.locks.Condition#await()方法和它重载方法 java.util.concurrent.locks.Condition...如果while来代替while Thread 1: synchronized (this) { while (!...可以参考上面例子while循环方式来重写这个方法。 3. 等待直到条件变成true或者超时时 不正确代码示范: synchronized (this) { if (!...doStuffAssumingConditionIsTrueOrTimeoutHasOccurred();} 虚假唤醒会导致doStuffAssumingConditionIsTrueOrTimeoutHasOccurred()方法在条件仍然false...如果你是这种场景,最好考虑用上面示例方式重写你代码。否则你必须依赖系统时间,系统时间在不同机器上是不一样

1.3K50

Java那些事儿

Java多线程开发如果涉及到共享资源操作场景,那就必不可少要和Java锁打交道。...Java锁机制主要分为 Lock和 Synchronized,本文主要分析Java锁机制使用和实现原理,按照Java锁使用、JDK锁实现、系统层锁实现顺序来进行分析,话不多说,let's go...可非阻塞获取锁:使用synchronized关键字获取锁时,如果没有成功获取,只有被阻塞,而使用Lock.tryLock()获取锁时,如果没有获取成功也不会阻塞而是直接返回false。...如果对象是数组类型,虚拟机用3个字宽(Word)存储对象头,如果对象是非数组类型,则用2字宽存储对象头。 ?...} return "r2 over"; } 注意,Linux下使用 pthread_cond_signal时候,会产生“惊群”问题,但是Java是不会存在这个“惊群”问题,那么Java是如何处理

29910

线程同步与互斥

return false业务回滚 bool update_data(){ if(optimistic_lock.check_vision(vision)){ mutex_.lock(); /...但是,如果长时间上锁的话,自旋锁会非常耗费性能,它阻止了其他线程运行和调度。线程持有锁时间越长,持有该锁线程将被 OS(Operating System) 调度程序中断风险越大。...如果pthread_rwlock_init读写锁分配了资源,pthread_rwlock_destroy将释放这些资源。...互斥锁必须是普通锁或适应锁,并且在进入pthread_cond_wait之前必须由本线程加锁。 在更新等待队列前,mutex必须保持锁定状态. 在线程进入挂起,进入等待前,解锁。...(涉及到CPU乱序执行、内存乱序读取等问题)5)以Java举例,Javasync实质上是锁+内存屏障(用来避免乱序执行和乱序读取),因此,不理解CPU内存模型初学者容易认为sync仅仅只是一个锁,用信号量就能模拟

77510

数组中出现次数超过一半数字

NowCoder 解题思路 Hash法 import java.lang.Integer; import java.util.HashMap; import java.util.*; import java.lang...此时剩下 n - i 个元素,majority 数目依然多于 (n - i) / 2,因此继续查找就能找出 majority。 加入数组存在众数,那么众数一定大于数组长度一半。...思想就是:如果两个数不相等,就消去这两个数,最坏情况下,每次消去一个众数和一个非众数,那么如果存在众数,最后留下数肯定是众数。...具体做法: 初始化:候选人cond = -1, 候选人投票次数cnt = 0 遍历数组,如果cnt=0, 表示没有候选人,选取当前数候选人,++cnt 否则,如果cnt > 0, 表示有候选人...,如果当前数=cond++cnt,否则–cnt 直到数组遍历完毕,最后检查cond是否众数 import java.lang.Integer; import java.util.HashMap;

26410

今天,进程告诉我线程它它它它不想活了

考虑有单个共享(锁)变量,初始 0 。当一个线程想要进入关键区域时,它首先会查看锁值是否 0 ,如果值是 0 ,进程会把它设置 1 并让进程进入关键区域。...如果状态是 1,进程会等待直到锁变量值变为 0 。因此,锁变量值是 0 意味着没有线程进入关键区域。如果是 1 意味着有进程在关键区域内。我们对上图修改后,如下所示 ?...假如进程 1 是最后存入 turn 1 。当两个进程都运行到 while 时候,进程 0 将不会循环并进入临界区,而进程 1 将会无限循环且不会进入临界区,直到进程 0 退出位置。...消费者逻辑也很相似:首先测试 count 值是否 0 ,如果 0 消费者睡眠、阻塞,否则会从缓冲区取出数据并使 count 数量递减。...当一个 wakeup 信号发送给仍在清醒进程后,该位置 1 。之后,当进程尝试睡眠时候,如果唤醒等待位 1 ,该位清除,而进程仍然保持清醒。

48410

源码剖析sync.cond(条件变量实现机制)

之前写过java朋友对等待/通知(wait/notify)机制一定很熟悉,可以利用等待/通知机制实现阻塞或者唤醒,在Go语言使用Cond也可以达到同样效果,接下来我们一起来看看它使用与实现。...sync.Cond基本使用 Go标准库提供了Cond原语,等待/通知场景下并发问题提供支持。...调用goparkunlock方法让当前Goroutine进入等待状态,也就是进入睡眠,等待唤醒 被唤醒后,调用releaseSudog释放当前等待列表Goroutine 看完源码我们来总结一下注意事项...最后我们总结一下使用这两个方法要注意问题: Signal:允许调用者唤醒一个等待此CondGoroutine,如果此时没有等待 goroutine,显然无需通知waiter;如果Cond 等待队列中有一个或者多个等待...如果此时没有等待goroutine,显然无需通知 waiter;如果 Cond 等待队列中有一个或者多个等待 goroutine,清空所有等待 goroutine,并全部唤醒,不强求你一定要持有

44110

线程、进程通信原理让你彻底整明白

考虑有单个共享(锁)变量,初始 0 。当一个线程想要进入关键区域时,它首先会查看锁值是否 0 ,如果值是 0 ,进程会把它设置 1 并让进程进入关键区域。...如果状态是 1,进程会等待直到锁变量值变为 0 。因此,锁变量值是 0 意味着没有线程进入关键区域。如果是 1 意味着有进程在关键区域内。...假如进程 1 是最后存入 turn 1 。当两个进程都运行到 while 时候,进程 0 将不会循环并进入临界区,而进程 1 将会无限循环且不会进入临界区,直到进程 0 退出位置。...消费者逻辑也很相似:首先测试 count 值是否 0 ,如果 0 消费者睡眠、阻塞,否则会从缓冲区取出数据并使 count 数量递减。...当一个 wakeup 信号发送给仍在清醒进程后,该位置 1 。之后,当进程尝试睡眠时候,如果唤醒等待位 1 ,该位清除,而进程仍然保持清醒。

75020

Linux线程-互斥与同步

出现负数原因: if语句判断条件真以后,代码可以并发切换到其他线程 usleep用于模拟漫长业务过程,在这个漫长业务过程,可能有很多个线程会进入该代码段 –ticket操作本身就不是一个原子操作...如果多个线程同时要求执行临界区代码,并且临界区没有线程在执行,那么只能允许一个线程进入该临界区 如果线程不在临界区执行,那么该线程不能阻止其他线程进入临界区 注:要做到这三点,本质上就是需要一把锁...,而可重入函数一定是线程安全 如果将对临界资源访问加上锁,这个函数是线程安全,但如果这个重入函数若锁还未释放则会产生死锁,因此是不可重入 三、常见锁概念 死锁: 死锁是指在一组进程各个进程均占有不会释放资源...,先上锁,发现条件不满足,解锁,然后等待在条件变量上 pthread_mutex_lock(&mutex); while (condition_is_false) { pthread_mutex_unlock...当唤醒时候可能竞争锁失败,继续等待,其他线程竞争成功执行后并释放锁,此时条件判断假,但是该线程竞争到锁后会继续往下执行,如果没有再次进行判断可能造成错误,使用while循环判断保证醒来后条件一定为真才往下走

1.7K20

聊聊stormAggregateProcessorexecute及finishBatch方法

等于expectedTupleCount表示完整接收完上游发过来tuple,然后触发finishBatch操作 SubtopologyBolt storm-core-1.2.2-sources.jar...数组,第一个元素GroupCollector,第二元素aggregator累加值;传入collectorFreshCollector GroupedAggregator storm-core-...[0]GroupCollector;arr[1]map,keygroup字段TridentTupleView,value_agginit返回值用于累加;arr[2]TransactionAttempt...ChainedResult,它objs字段存放每个_aggs对应init结果 这里_agg如果是Aggregator类型,则为用户在groupBy之后aggregate方法传入aggregator...TridentBoltExecutorTrackedBatchcondition.commitStreamnull,因而receivedCommittrue),就立即调用finishBatch(

55250
领券