
不会报错
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是什么意思等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)