概述 每个Thread类的示例都代表一个线程,而进程是操作系统级别的多任务,JVM就是运行在一个进程当中的。所以在Java中更多的应该考虑线程。进程的内存是可以被多个线程共享使用的。...使用线程根本上是为了更充分的利用cpu资源。 线程的状态 查看Java源码可知,线程的状态一共有6种,分别是新建、运行、阻塞、等待、超时等待、终止。...什么是重入锁 ReentrantLock是实现Lock接口的一个类,支持重入性。线程在被两次lock加锁后会被阻塞,在复杂的调用场景中为了避免这种情况,于是就有了可重入锁。...默认情况下,重入锁是不公平的,多个线程竞争锁时不按照顺序来,而是随机获取。...对于同一个线程,重入锁允许你反复获得一把锁,但是,申请和释放锁的次数必须一致。 默认情况下,重入锁是非公平的,公平的重入锁性能差于非公平锁 重入锁的内部实现是基于CAS操作的。
最近正在阅读Java ReentrantLock源码,始终对可重入和不可重入概念理解不透彻,进行学习后记录在这里。...基础知识 Java多线程的wait()方法和notify()方法 这两个方法是成对出现和使用的,要执行这两个方法,有一个前提就是,当前线程必须获其对象的monitor(俗称“锁”),否则会抛出IllegalMonitorStateException...wait():阻塞当前线程 notify():唤起被wait()阻塞的线程 不可重入锁 所谓不可重入锁,即若当前线程执行某个方法已经获取了该锁,那么在方法中尝试再次获取锁时,就会获取不到被阻塞。...这个例子很好的说明了不可重入锁。 可重入锁 接下来,我们设计一种可重入锁 ? 所谓可重入,意味着线程可以进入它已经拥有的锁的同步代码块儿。...可重入锁的概念和设计思想大体如此,Java中的可重入锁ReentrantLock设计思路也是这样
所谓重入锁,指的是以线程为单位,当一个线程获取对象锁之后,这个线程可以再次获取本对象上的锁,而其他的线程是不可以的。 synchronized 和 ReentrantLock 都是可重入锁。...可重入锁的意义在于防止死锁。 实现原理是通过为每个锁关联一个请求计数器和一个占有它的线程。...,而其他线程是不可以的,这就是可重入锁。...可重入锁的概念和设计思想大体如此,Java中的可重入锁ReentrantLock设计思路也是这样。 synchronized和ReentrantLock 都是可重入锁。...摘自:JAVA可重入锁与不可重入锁 和 Java不可重入锁和可重入锁理解 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/153277.html原文链接:https
最近正在阅读Java ReentrantLock源码,始终对可重入和不可重入概念理解不透彻,进行学习后记录在这里。...基础知识 Java多线程的wait()方法和notify()方法 这两个方法是成对出现和使用的,要执行这两个方法,有一个前提就是,当前线程必须获其对象的monitor(俗称“锁”),否则会抛出IllegalMonitorStateException...wait():阻塞当前线程 notify():唤起被wait()阻塞的线程 不可重入锁 所谓不可重入锁,即若当前线程执行某个方法已经获取了该锁,那么在方法中尝试再次获取锁时,就会获取不到被阻塞。...这个例子很好的说明了不可重入锁。...可重入锁的概念和设计思想大体如此,Java中的可重入锁ReentrantLock设计思路也是这样 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/153238.html
定义 可重入锁:当线程获取某个锁后,还可以继续获取它,可以递归调用,而不会发生死锁; 不可重入锁:与可重入相反,获取锁后不能重复获取,否则会死锁(自己锁自己)。 不可重入锁 用代码说话。...基于 wait/notify 实现不可重入锁 import java.util.concurrent.locks.ReentrantLock; /** * 不可重入锁 */ public class...可重入锁 不可重入锁扩展一下,增加一个计数器,同一个线程每次获取锁计数器加1,释放锁减1,为0时释放锁。...基于自旋锁实现可重入锁 直接用上个例子的代码改一下: import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.locks.ReentrantLock...Java中很常见的工具类, 从名字就可以看出,它是个可重入锁,用法也很简单: import java.util.concurrent.locks.ReentrantLock; public class
这时就无法再调用doAdd()方法,这时必须先释放锁才能调用,所以称这种锁为不可重入锁,也叫自旋锁。...:线程可以进入任何一个它已经拥有的锁所同步着的代码块。...第一个线程执行print()方法,得到了锁,使lockedBy等于当前线程,也就是说,执行的这个方法的线程获得了这个锁,执行add()方法时,同样要先获得锁,因不满足while循环的条件,也就是不等待,...只有当第一个线程释放了所有的锁,执行了notify()方法,第二个线程才得以跳出循环,继续执行。 这就是可重入锁的特点。...java中常用的可重入锁 synchronized java.util.concurrent.locks.ReentrantLock AtomicIntegerFieldUpdater:原子更新整型的字段的更新器
在Java多线程编程中,锁是一项关键的技术,用于保护共享资源,确保线程安全。...ReentrantLock(可重入锁)是Java中强大而灵活的锁机制之一,本文将深入解析ReentrantLock的原理和使用方法。...ReentrantLock的基本概念ReentrantLock是Java.util.concurrent包中的一部分,是一种可重入的独占锁。可重入意味着同一个线程可以多次获取同一把锁而不会造成死锁。...2.3 可重入性ReentrantLock支持可重入性,同一线程可以多次获取锁,每次获取都必须有对应的释放操作。这使得线程可以嵌套地使用锁,而不会出现死锁。3....结语ReentrantLock是Java多线程编程中非常强大的锁机制,它提供了可重入性、公平性、条件变量等丰富的特性,适用于各种复杂的同步需求。
简介 ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞。...在java关键字synchronized隐式支持重入性。synchronized通过获取自增,释放自减的方式实现重入。与此同时,ReentrantLock还支持公平锁和非公平锁两种方式。...重入性 重入性关键点在于以下两个方面: 1、在线程获取锁的时候,如果已经获取锁的线程是当前线程的话则直接再次获取成功; 2、由于锁会被获取n次,那么只有锁在被释放同样的n次之后,该锁才算是完全释放成功。...[] 0获取锁的当前线程[3], 同步队列中的线程[] 1获取锁的当前线程[3], 同步队列中的线程[] 0获取锁的当前线程[4], 同步队列中的线程[] 1获取锁的当前线程[4], 同步队列中的线程[...] 0获取锁的当前线程[1], 同步队列中的线程[] 1获取锁的当前线程[1], 同步队列中的线程[] 非公平锁耗时:7 线程会重复获取锁。
前言 目前主流的锁有两种,一种是synchronized,另一种就是ReentrantLock,JDK优化到现在目前为止synchronized的性能已经和重入锁不分伯仲了,但是重入锁的功能和灵活性要比这个关键字多的多...,所以重入锁是可以完全替代synchronized关键字的。...下面就来介绍这个重入锁。 正文 ReentrantLock重入锁是Lock接口里最重要的实现,也是在实际开发中应用最多的一个,我这篇文章更接近实际开发的应用场景,为开发者提供直接上手应用。...第二种声明的是非公平锁,所谓非公平锁就和公平锁概念相反,线程等待的顺序并不一定是执行的顺序,也就是后来进来的线程可能先被执行。...,此时说明有一名线程已经拿到了锁。
重入锁,顾名思义,就是支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁。重进入是指任意线程在获取到锁之后能够再次获取该锁而不会被锁阻塞,该特性的实现需要解决以下两个问题。...Java里面内置锁(synchronize)和Lock(ReentrantLock)都是可重入的 关键字synchronized拥有锁重入的功能,也就是在使用synchronized时,当一个线程得到了一个对象的锁后...可以看到线程t1执行完之后才执行的线程t3,最后执行的是线程t2,线程t1由方法method1要去执行由synchronized修饰的method2,直接便可以获取到锁,这种情况便是锁重入。...如果synchronized不支持锁重入的话,会造成死锁的情况(method1还没执行完,要执行method2,method2不让获取锁的话,method1就执行不完了)。...可见重入锁最大的作用是避免死锁 上面说的是一种锁重入的场景,锁重入还有一种常见的情形,那就是父子类的情况,再看一个例子 package com.xiaoyexinxin.ThreadLearn; public
所谓重入锁,指的是以线程为单位,当一个线程获取对象锁之后,这个线程可以再次获取本对象上的锁,而其他的线程是不可以的。 synchronized 和 ReentrantLock 都是可重入锁。...可重入锁的意义在于防止死锁。 可重入锁简单演示 什么是 “可重入”,可重入就是说某个线程已经获得某个锁,可以再次获取锁而不会出现死锁。...类对象的锁,而其他线程是不可以的,这就是可重入锁。...这个例子很好的说明了不可重入锁。...可重入锁的概念和设计思想大体如此,Java中的可重入锁ReentrantLock设计思路也是这样。 synchronized和ReentrantLock 都是可重入锁。
重入锁ReentrantLock,支持重进入的锁,能支持一个线程对资源的重复加锁 支持获取锁时的公平和非公平的选择,默认非公平 锁的公平与否:在绝对时间上,先对锁进行获取的请求一定先被满足,则锁是公平的...重进入是指任意线程在获取到锁之后能够再次获取该锁,需要解决两个问题: 识别获取锁的线程是否为占据当前锁的线程。 线程重复n次获取锁,随后第n次释放锁后,其他线程能获取到锁。...ReentrantLock通过组合自定义同步�器实现锁的获取和释放: nonfairTryAcquire方法非公平获取 tryAcquire()方法公平获取,比nonfairTryAcquire多了hasQueuedPredecessors...公平锁和非公平锁的代码示例: import org.junit.Test; import java.util.ArrayList; import java.util.Collection; import...java.util.Collections; import java.util.List; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock
四、可重入锁: 本文里面讲的是广义上的可重入锁,而不是单指JAVA下的ReentrantLock。...可重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。...在JAVA环境下 ReentrantLock 和synchronized 都是 可重入锁 下面是使用实例: ? ? 两个例子最后的结果都是正确的,即 同一个线程id被连续输出两次。...对于自旋锁来说, 1、若有同一线程两调用lock() ,会导致第二次调用lock位置进行自旋,产生了死锁 说明这个锁并不是可重入的。...该自旋锁即为可重入锁。
所谓的可重入是指,线程可对同一把锁进行重复加锁,而不会被阻塞住,这样可避免死锁的产生。ReentrantLock 的主要功能和 synchronized 关键字一致,均是用于多线程的同步。...由于 m1 和 m2 使用的是同一把可重入锁,所以线程 t 可以进入方法 m2,并再次获得锁,而不会被阻塞住。...不过好在《Java并发编程实战》在第13.3节 公平性(p232)说明了具体的原因,这里引用一下: 在激烈竞争的情况下,非公平锁的性能高于公平锁的性能的一个原因是:在恢复一个被挂起的线程与该线程真正开始运行之间存在着严重的延迟...线程 C 在抢占锁的情况下,仍未影响线程 B 获取锁,因此是个“双赢”的局面。 除了上面的原因外,《Java并发编程的艺术》在其5.3.2 公平与非公平锁的区别(p137)分析了另一个可能的原因。...,则将自己设为持锁线程后返回 若同步状态不为0,且当前线程为持锁线程,则执行重入逻辑 3.2.3 公平和非公平细节对比 如果大家之前阅读过公平锁和非公平锁的源码,会发现两者之间的差别不是很大。
两种锁定方式各有优劣,下面简单对比一下: 1、synchronized是关键字,就和if…else…一样,是语法层面的实现,因此synchronized获取锁以及释放锁都是Java虚拟机帮助用户完成的;...5、和synchronized相比,ReentrantLock提供给用户多种方法用于锁信息的获取,比如可以知道lock是否被当前线程获取、lock被同一个线程调用了几次、lock是否被任意线程获取等等...ReentrantReadWriteLock会使用两把锁来解决问题,一个读锁,一个写锁 线程进入读锁的前提条件: 没有其他线程的写锁, 没有写请求或者有写请求,但调用线程和持有锁的线程是同一个 线程进入写锁的前提条件...: 没有其他线程的读锁 没有其他线程的写锁 到ReentrantReadWriteLock,首先要做的是与ReentrantLock划清界限。...然后就是总结这个锁机制的特性了: (a).重入方面其内部的WriteLock可以获取ReadLock,但是反过来ReadLock想要获得WriteLock则永远都不要想。
更多关于JMM的知识请参考此文章:Java多线程内存模型 想要避免这种多线程并发操作引起的数据异常问题一个简单的解决方案就是加锁。JDK提供的synchronize就是一个很好的选择。...还没有优化synchronize之前还有一个锁比它表现的更为亮眼,这个锁就是重入锁。...在之前的文章:多线程基本概念 中有提到过因为线程优先级而导致的饥饿问题,重入锁提供了一种公平锁的功能,可以忽略线程的优先级,让所有线程公平竞争。...对于synchronize来说,如果一个线程获取资源的时候要么阻塞要么就是获取到资源,这样的情况是无法解决死锁问题的。而重入锁则可以响应中断,通过放弃资源而解决死锁问题。...,3个线程并发写的状况,如果我们使用synchronize或者重入锁的时候我想上方最后的耗时应该是26秒多。
锁:非常广义的概念,不是指某个具体的锁,所有的锁都可以往这些策略中套 synchronized:只是市面上五花八门的锁种,其中一种典型的实现,Java 内置的,推荐使用的锁 乐观锁和悲观锁 这两个词不是指某个具体的锁...公平锁: 在计算机中,约定“先来后到”为公平 非公平锁: 系统原生 synchronized 属于非公平锁 当 N 个线程竞争同一个锁,其中一个线程拿到锁了,后续该线程释放锁之后,剩下的 N-1 个线程...如需要使用公平锁,就需要做额外的工作 比如引入队列,记录每个线程加锁的顺序 可重入锁和不可重入锁 死锁问题:如果一个线程,针对同一把锁,连续加锁两次,就可能出现死锁,如果把锁设为“可重入”就可以避免死锁了...可重入:是专门的计算机术语,不要写作“可重复”这样的词 可重入锁 会记录当前是哪个线程持有了这把锁 在加锁的时候判定,当前申请锁的线程,是否就是锁的持有者 计数器,记录加锁的次数,从而确定何时真正释放锁...所以就让读操作不产生锁冲突,这样就只有少数写操作会产生冲突,这样效率就高了 读写锁提供了两种加锁的 API,系统内置的锁,Java 标准库中的读写锁类为:ReentrantReadWriteLock 加读锁
* Thread-1释放了锁 * Thread-0获得了锁 * Thread-0释放了锁 */ 可重入性 可重入性是指线程获得锁之后,没有释放锁,当再次需要获得同一把锁的时候仍然可以成功。...如果锁是不可重入的,第二次获得锁的时候就会导致死锁。...如果state大于0,则判断持有锁的线程是不是当前线程,如果是则需要更新重入次数,重新设置state的值后返回true,反之则表示锁已经被其他线程所持有,直接返回false。...; } 如果当前持有锁的线程不是当前线程则直接抛出异常,否则继续判断state的值,如果state为0,则清空锁的持有线程,如果state不为0,则减少重入次数。...参考资料: 《Java并发编程之美》 一文彻底理解ReentrantLock可重入锁的使用
使用Java进行多线程开发,使用锁是一个几乎不可避免的问题。今天,就让我们来聊一聊这个基础,但是又特别特别重要的话题。 首先,让我们来看一下,到底什么是锁? 以及,为什么要使用锁?...而读线程也是一样,先取得锁,再读,然后释放锁。这样就可以避免发生这种情况。 如下图所示: ? 什么是重入锁? 好了,现在大家知道我们为什么要使用锁了。那什么是重入锁呢。...所以,对于希望傻瓜式编程的我们来说,重入锁就是用来解决这个问题的。重入锁使得同一个线程可以对同一把锁,在不释放的前提下,反复加锁,而不会导致线程卡死。...Java中的重入锁 Java中的锁都来自与Lock接口,如下图中红框内的,就是重入锁。 ?...,所以我把他当做多线程系列的第一章节,对于重入锁,我们需要特别知道几点: 对于同一个线程,重入锁允许你反复获得通一把锁,但是,申请和释放锁的次数必须一致。
不可重入锁示例(同一个线程不可以重入上锁后的代码段) 如下是一个不可重入锁的逻辑过程,会发现执行main方法控制台会打印执行doJob方法前,然后就会一直线程阻塞,不会打印执行doJob方法过程中,原因在于第一次上锁后...,由于没有释放锁,因此执行第一次lock后isLocked = true,这个时候调用doJob()内部又一次调用了lock()由于上个线程将isLocked = true,导致再次进入的时候就进入死循环...这种现象就造成了不可重入锁 public class Count{ MyLock lock = new MyLock(); public static void main(String...notify(); // 接触阻塞 } } 可重入锁示例(同一个线程可以重入上锁的代码段,不同的线程则需要进行阻塞) java的可重入锁有:ReentrantLock...(显式的可重入锁)、synchronized(隐式的可重入锁) 可重入锁诞生的目的就是防止上面不可重入锁的那种情况,导致同一个线程不可重入上锁代码段。
领取专属 10元无门槛券
手把手带您无忧上云