手机锁定怎么解开

手机锁定怎么解开,第1张

java使用锁来保证多线程 *** 作共享资源的原子性、可见性、有序性。同时锁一般这样性质:可重入、是否公平。

java使用synchronized来获取锁,并会隐式释放锁,该锁是一个可重入的非公平锁。

在jdk5后,可以使用ReentranLock来完成多线程同步问题,具有跟synchronized一样的功能,支持可重入和非公平锁

如果我们查看源码源码,就会发现

加锁:locklock() -> Synclock -> AbstractQueuedSynchronizeracquire(1)

释放锁:lockunlock() -> Syncrelease(1) -> AbstractQueuedSynchronizeracquire(1)

锁的实现主要靠AbstractQueuedSynchronizer(抽象队列同步器)

主要的逻辑是,先尝试获取锁,获取失败则线程封装成一个节点添加到线程同步列表中,并响应线程中断

这两个方法通过cas实现的一个同步队列,保证了添加节点,在多线程环境中将会正确的被添加到队列的末尾。compareAndSetHead()和compareAndSetTail()就是通过cas来完成头部、尾部结点的替换的

acquire方法主要做的是:如果一开始尝试获取锁失败,则把线程封装成同步队列的结点,并加入到同步队列尾结点,同时开始自旋,当该线程结点是同步队列的首个线程结点(非头结点),尝试获取锁。这一条件判断是final Node p = nodepredecessor(); if (p == head);为什么是判断线程结点的前驱指向头结点来确定是否是首个线程结点?而不是取头结点的后驱结点?就是因为addWaiter所构建的同步队列,在对象线程中能保证 head <- node <- tail的前驱指向性的正确,无法保证后驱的指向性是正确的。锁的获取到这一步就完成

释放锁的时候,先尝试释放锁,成功则查看同步队列的头结点下个节点(首个线程节点)是否等待唤醒,如果需要唤醒,这个唤醒盖线程。这个主要是条件等待引起的,先不讨论。

ReentranLock是一个可重入锁且实现公平锁和非公平锁,其内部同步队列器具体实现是

线程同步是否成功修改同步器的state来判断是否获取锁成功。nonfairTryAcquire,如果获取锁成功,设置当前线程为锁的独占线程。如果已有线程获取到锁,则判断当前线程是否是锁的独占线程,是则算获取锁成功,以此实现锁可重入的问题

公平锁比非公平锁在尝试获取锁多一个判断hasQueuedPredecessors(),该方法是判断同步队列是否存在线程结点,且同步队列首个线程结点中的线程不等于当前线程。从而保证当每个线程获取锁的时候,如果同步队列存在线程结点,该线程获取锁失败从而加入到同步队列的尾结点,保证获取锁的顺序,即公平性。在可重入的实现与非公平锁一致。

因为这独占锁,先判断获取锁的线程是否是当前线程,如果state归零,代表当前线程不持有锁,设置锁的独占线程为空,然后修改同步器state。

以上就是关于手机锁定怎么解开全部的内容,包括:手机锁定怎么解开、什么是分布式锁实现方式有哪些、Redis实现分布式锁与Zookeeper实现分布式锁区别等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: https://outofmemory.cn/web/9457607.html

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

发表评论

登录后才能评论

评论列表(0条)

保存