首页 > 编程知识 正文

java中为什么要加锁,java中锁表超时

时间:2023-05-04 01:46:30 阅读:155970 作者:1232

是否锁定锁定分类同步资源-乐观锁定和悲观锁定自旋锁定和自适应自旋锁定公平锁定和不公平锁定可重锁定,不可重锁定

java锁定有很多种。 常见的有公平锁定和非公平锁定、乐观锁定和悲观锁定、可重入和不可重入等。

分类如下。

是否锁定同步资源-乐观锁定和悲观锁定乐观锁定:修改共享数据时,其他线程不修改此共享数据,而是在提交时比较内存值和期望值,如果相同则更新,如果不同则重试乐观摇滚常用的算法是CAS(比较交换),经常用于大量阅读和写作。

乐观摇滚有什么缺点?

1.ABA问题2 .自旋时间过长会浪费cpu资源。

悲观锁定:修改共享数据时,其他线程一定会修改此共享数据。 因此,修改进程将被锁定,以确保在提交之前只有一个线程正在执行修改。 悲观摇滚常用摇滚,synchronizedlock

悲观摇滚有什么缺点?

当一个线程获得锁时,其他线程将被阻止。在唤醒和阻塞的时候,需要切换核态,同时要恢复现场,比较耗费处理器的时间,切换核态以及恢复现场所用的时间很可能比执行加锁代码块的时间长

自旋锁定和自适应自旋锁定的实现原理也是CAS。 他可以在不阻塞的情况下旋转线程等待,从而切换cpu的状态。 但是,如果旋转时间过长,则会浪费cpu资源。

自适应自旋锁:可以解决自旋锁自旋时间过长。 每次旋转的时间不是固定的,而是由上次旋转的时间决定的。 如果某个锁很少获得旋转,则稍后尝试获得该锁将跳过旋转过程,并直接阻塞线程。

公平锁定和非公平锁定公平锁定:同步队列中的第一个线程按申请锁定的顺序锁定。 每个线程都以先进先出的方式获得锁,但具有吞吐量低的缺点。

安费尔洛克:你可以不按照申请摇滚的顺序。 一个刚进入的线程可以与同步队列中的第一个线程一起竞争锁(而不考虑队列问题),以便该刚进入的线程可以在不阻塞的情况下获得锁。 虽然吞吐量很高,但一些线程可能会饿死。

请参阅公平锁和非公平锁的源代码:

通过比较上图的源代码,公平锁和非公平锁的lock ) )方法的唯一区别在于公平锁在获取同步状态时添加了限制条件。 hasQueuedPredecessors ) )。

进一步进入hasQueuedPredecessors (),您会发现该方法主要是在做一件事。 主要是判断当前线程是否位于同步队列的开头。 如果是,则返回true;否则返回false。

以上总结如下:公平锁就是通过同步队列来实现多个线程按照申请锁的顺序来获取锁,从而实现公平的特性。非公平锁加锁时不考虑排队等待问题,直接尝试获取锁,所以存在后申请却先获得锁的情况。

可重入锁不是可重入锁。 当线程获取外部函数的锁定时,可以在访问内部函数时直接获取锁定。 这就是可重入锁,但前提是它必须是同一对象或同一类。 在Java中,ReentrantLock和synchronized都可以再锁定,可再锁定的优点之一是在一定程度上可以避免死锁。

无法重新锁定:如果线程获得了对外部函数的锁定,则在访问内部函数时必须将其锁定。

显示源代码: http://www.Sina.com/: http://www.Sina.com /时,如果status为0,则直接获取运行。 如果不是0,则判断具有锁的线程是否为当前线程,如果不是,则为status 1。可重入锁时,也判断当前线程是否为占用锁的线程,判断status是否为0,0时表示可以释放,将持有当前锁的线程设为null。

获取锁:获取锁定时,直接使用CAS尝试更新状态。 如果更新失败,当前线程将被阻止。 解除锁定时,判断拥有锁定的线程是当前线程时,将status直接代入1,1,http://www.Sina.com /。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。