lock.trylock后再lock会报错吗

lock.trylock后再lock会报错吗,第1张

不会报错

1、locklockInterruptibly()的作用是:如果当前线程未被中断,则获取锁定(需要等待别的线程释放锁才行),如果已被中断则出现异常。但是使用locklock()时,当前线程被中断,不会报错。

2、locktryLock()和locktryLock(Long timeout,TimeUnit unit)的作用

locktryLock()的作用是:仅在调用时锁定未被另一个线程保持的情况下,才获取该锁定,否则就不获取。就是说只会去获取未被锁定的线程。

locktryLock(long timeout,TimeUnit unit)的作用是:如果给定线程在等待时间内未被另一个线程保持,且当前线程未被中断,则获取该锁定,否则就不获取,相当于tryLock()加了等待时间。

lock是C#中最常用的同步方式,格式为lock(objectA){codeB} 。

lock(objectA){codeB} 看似简单,实际上有三个意思,这对于适当地使用它至关重要:

1、objectA被lock了吗?没有则由我来lock,否则一直等待,直至objectA被释放。

2、 lock以后在执行codeB的期间其他线程不能调用codeB,也不能使用objectA。

3、执行完codeB之后释放objectA,并且codeB可以被其他线程访问。

扩展资料:

lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断。这是通过在代码块运行期间为给定对象获取互斥锁来实现的。

提供给 lock 关键字的参数必须为基于引用类型的对象,该对象用来定义锁的范围。在上例中,锁的范围限定为此函数,因为函数外不存在任何对该对象的引用。如果确实存在此类引用,锁的范围将扩展到该对象。

严格地说,提供给 lock 的对象只是用来唯一地标识由多个线程共享的资源,所以它可以是任意类实例。然而,实际上,此对象通常表示需要进行线程同步的资源。

例如,如果一个容器对象将被多个线程使用,则可以将该容器传递给 lock,而 lock 后面的同步代码块将访问该容器。只要其他线程在访问该容器前先锁定该容器,则对该对象的访问将是安全同步的。

lock和UNLock的意思分别为锁和解锁。

一、lock

1、读音

英 [lɒk]  美 [lɑːk]

2、含义

n 锁;水闸;一缕头发;一簇;一束

v 固定;锁(住);抓牢;过闸

3、例证

He chiseled a hole in the door to fit a new lock

他在门上凿了个孔,以便装一把新锁。

二、unlock

1、读音

英 [ˌʌn'lɒk]  美 [ˌʌn'lɑːk]

2、含义

v 开锁;开启;揭开;显露

3、例证

She fail to unlock the safe in spite of all her exertion

她虽然费尽力气,仍未能将那保险箱的锁打开。

扩展资料

一、词汇用法:

lock的基本意思是“锁上”“锁住”,也可表示“卡住”,引申可作“使…固定”解。

lock用作及物动词时接名词或代词作宾语,可用于被动结构。

lock用作不及物动词时主动形式常含有被动意义。

二、同近义词

bolt  核心词汇

英 [bəʊlt]  美 [boʊlt]

n 门闩;螺栓;一卷布;弩箭

v (突然)逃离;闩住;狼吞虎咽;用螺栓固定

adv 挺直地

The bolt slotted smoothly into place

插销很容易就插上了。

lock&labs怎么用。

1Lock锁可以在我们需要的地方显式的调用,或者中断,以及超时获取锁等更加灵活的锁 *** 作;但是失去了synchronize隐式获取与释放的便捷性

2Lock锁必须使用unLock释放,因此我们大多在finally代码块中释放

//获取锁

void lock();

//获取锁过程中可以响应中断

void lockInterruptibly() throws InterruptedException;

//非阻塞式响应能够马上返回,获取锁返回true,反之false

boolean tryLock();

//超时获取锁,在超时time内或未中断情况下,可以获取锁

boolean tryLock(long time, TimeUnit unit) throws InterruptedException;

//释放锁

void unlock();

//获取与lock绑定的等待通知组件,当前线程必须获取锁才能进行等待

//等待时释放锁,当再次获取锁才能从等待中返回

Condition newCondition();

为了方便叙述,这里把 AQS 中的同步队列描述为主同步队列,以区别于 AQS 中的条件等待队列。把主同步队列中排队等待获取写锁的线程称为写线程,把主同步队列中排队等待获取读锁的线程称为读线程。

可重入读写锁获取和释放锁的模型使用的仍然是 AQS 的主同步队列,没有使用额外的队列。主同步队列是一个双向队列,而且这个双向队列中会存储排队等候的写线程或读线程对应的节点,也就是说主同步队列中排队等候的线程既有可能是写线程,也有可能是读线程,还有可能是两种线程的混合。

在可重入读写锁中, AQS 的 state 值被用来同时存储当前持有读锁计数和写锁计数,注意这个计数是所有线程持有的总的读锁和写锁计数。其中 state 的低16位被用来存储写锁持有计数,高16位被用来存储读锁计数。因此读锁和写锁的最大持有计数为 2^16-1 。

由于可重入读写锁的写锁是互斥的,所以读写锁的写锁获取和 ReentrantLock 锁获取类似。

读锁是共享锁,多个读线程可以同时获取读锁,读锁活跃期间,写锁无法获取

8如果读锁获取失败,那么和写锁获取失败一样,会创建一个对应线程的共享模式的节点进入主同步队列,重试2次,如果还是没有获取到读锁,那么阻塞等待唤醒。

写锁释放的条件是当前线程持有写锁,否则抛出 IllegalMonitorStateException

读锁释放的条件也是当前线程必须持有写锁,否则抛出 IllegalMonitorStateException

2获取 state 值,减少一个读锁持有计数单位,并更新 state 。由于读锁是共享的,可能有多个线程释放或获取读锁,更新 state 值需要使用 CAS ,并且通过循环保证 CAS 一定成功。

3最后判断如果 state 的值是否是0,由于读锁和写锁互斥,释放读锁时, state 值中的写锁计数一定是0,而如果 state 是0,那么说明读锁计数也是0,说明没有线程持有读锁了。如果 state 不是0,说明读锁持有计数不是0,那么释放读锁只需要将当前线程的读锁持有计数和 state 中总的读锁持有计数-1即可。如果 state==0 ,那么没有线程持有读锁了,这时释放读锁会唤醒主同步队列中第一个需要唤醒的线程节点(节点的 waitStatus==NodeSIGNAL ),并且这个线程只能是写线程。因为当前线程持有读锁期间,如果有读线程获取读锁,根据读锁的获取方式推断,读锁一定是能够获取成功的,所以不会在主同步队列中堆积。因此在主同步队列中堆积的第一个线程一定是写线程。所以在释放读锁时,如果需要唤醒主同步队列中排队等待唤醒的线程也一定是写线程。

>

以上就是关于lock.trylock后再lock会报错吗全部的内容,包括:lock.trylock后再lock会报错吗、c# lock 用法、Lock和UNLock是什么意思等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/10129795.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存