java多线程中关于解决死锁的方法说法错误的是,java多线程锁机制

  java多线程中关于解决死锁的方法说法错误的是,java多线程锁机制

  00-1010 1.常见锁策略1.1乐观锁和悲观锁1.2读写锁和常见互斥锁1.3重量级锁和轻量级锁1.4挂起锁和自旋锁1.5公平锁和不公平锁1.6可重入锁和不可重入锁1.7死锁问题1.7.1常见死锁情况1.7.2哲学家进餐问题2。CAS指令和ABA问题2.1CAS指令2.2ABA问题本文将介绍CAS中常见的锁策略和ABA问题。使用synchronized关键字来保证线程的安全性,本质上就是锁定对象。同步锁是一种什么样的锁?本文带你一探究竟。

  

目录

  00-1010乐观锁和悲观锁是按照处理锁冲突的态度来分类的。

  乐观锁期望锁碰撞的概率很低,所以需要更少的准备,更少的努力,更高的效率。悲观锁预期锁冲突的概率很高,因此需要更多的准备、更多的努力和更低的效率。

  00-1010普通互斥体只有两种操作:

  锁被解锁,并且有三种读写锁的操作:

  添加读锁,如果代码只读取,添加读锁。添加写锁,如果代码包含写操作,添加写锁。解锁。读锁和读锁之间并不互斥,因为在多线程中同时读取一个变量是线程安全的,读锁和写锁之间,写锁和写锁之间是互斥的。

  在java中,带有读写锁的标准类位于Java . util . concurrent . locks . reentrantreadwritelock,其中reentrantreadwritelock . read lock是读锁,reentrantreadwritelock . writelock是写锁。

  00-1010这两种锁与悲观锁乐观锁有一定程度的重叠。重量级锁做的事多,成本高,轻量级锁做的事少,成本低。在大多数情况下,重量级锁可以被视为悲观锁,轻量级锁可以被视为乐观锁。

  如果锁的底层在内核模式下实现(比如调用操作系统提供的互斥接口),一般认为是重量级锁,如果在纯用户模式下实现,一般认为是轻量级锁。

  00-1010挂起等待锁是指当锁获取失败时,对应的线程会在内核中挂起等待(放弃CPU,进入等待队列),需要在锁释放后被操作系统唤醒。这种类型的锁是重量级锁的典型实现。自旋锁是指锁获取失败后,不会立即放弃CPU,而是快速频繁地再次查询锁的持有状态。一旦锁被释放,就可以立即获得锁。这种类型的锁是轻量级锁的典型实现。

  挂起等待锁与自旋锁的区别

  最明显的区别就是挂起等待锁的开销比自旋锁大,挂起等待锁的效率不如自旋锁。等待锁会放弃CPU资源,而自旋锁不会放弃CPU资源,而是一直等到锁被释放。与挂起的锁相比,自旋锁可以及时获得新释放的锁。自旋锁与挂起锁相比的缺点是,当自旋持续时间较长时,会不断消耗CPU资源,所以自旋锁也可以称为乐观锁。

  00-1010公平锁遵循先到先得的原则。当多个线程正在等待一个锁时,谁先尝试获取锁,谁就拥有这个锁。不公平锁遵循随机性原则。当多个线程正在等待一个锁时,当锁被释放时,每个线程获得锁的概率是相等的。

  00-1010一个线程连续锁两次,不会造成死锁。那么这个锁就是可重入锁。相反,如果一个线程连续锁了两次锁,就会导致死锁,所以锁是不能重新锁的。

  什么是死锁?等一下,后面会介绍。

  基于以上锁策略,synchronized添加了什么样的锁?

  它既是乐观锁,也是悲观锁。锁竞争小的时候是乐观锁,锁竞争大的时候是悲观锁。这是一个常见的互斥体。它既是轻量级锁,也是重量级锁,根据锁竞争的激烈程度自适应。轻量级锁基于自旋锁,重量级锁基于挂起锁。这是一把不公平的锁。这是一把重入锁。

  

1.常见的锁策略

  00-1010死锁是指多个进程在运行过程中争夺资源而导致的死锁。当进程处于这种僵局时,如果没有外力,它们将无法前进。

  情况1:一个线程有一个锁,比如下面这种情况。

  Lock方法(){lock (this) {//code block}}首先第一次锁,能成功是因为当前对象没有锁,然后进入方法,

  再次进行加锁,此时由于当前对象已经被锁占用,所以会加锁失败然后尝试再次加锁,此时就会陷入一个加锁的死循环当中,造成死锁。

  

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: