首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

深入理解Java(二)

当有线程进来时,会先判断count值,如果count为0说明没有被占用 然后通过CAS操作进行抢 如果抢到则count值会加1,同时将owner设置为当前线程引用 如果count不为0同时owner...指向当前线程引用,则将count值加1 如果count不为0同时owner指向不是当前线程引用,则将线程放入等待队列waiters 如果CAS抢失败,则将线程放入等待队列waiters 当线程使用完后...,会释放其持有的,释放时会将count值减1,如果count值为0则将owner设为null 如果count值不为0则会唤醒等待队列头部线程进行抢 手动实现ReentrantLock代码示例:...,消除,偏向,轻量级释放由虚拟机完成,不用人工干预,降低了死锁可能性 缺点: 悲观排他,无法实现高级功能如公平,读写等 Lock: 优点:可以实现synchronized无法实现高级功能如公平...,读写等,同时还可以实现更多功能  缺点:需手动释放unlock,使用不当容易造成死锁 结论: 两者都是可重入,synchronized可以类比为傻瓜相机,提供了固定功能,而Lock可以类比为单方

32720

理解Java状态与优化

Java乐观一般都是通过CAS来实现,如Atom系列并发工具包类。在nosql数据里面elasticsearch就是典型使用乐观来更新每条数据。...关于Java对象存储结构 提到状态,这里必须要提一下Java对象存储结构,总体上来说每个实例对象由三部分组成:对象头,实例数据,对其填充。...轻量级 轻量级,顾名思义,相比重量级,其加锁和解锁开销会小很多。重量级之所以开销大,关键是其存在线程上下文切换开销。而轻量级通过JAVACAS实现方式,避免了这种上下文切换开销。...当compare失败时候(理解成没有拿到""),当compare成功时候,可以直接对互斥资源进行修改(就好像拿到了“一样”),此外,轻量级失败时候线程不会被挂起,会通过自旋方式再次尝试获取...优化 (1)可重入性,在synchronized方法,可以继续调用该实例其他synchronized方法,这就是可重入性。

55540
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    深入理解Java(一)

    Java概念 自旋 :是指当一个线程在获取时候,如果已经被其他线程获取,那么该线程将循环等待,然后不断判断是否能够被成功获取,直到获取到才会退出循环。...不可重入 :线程拿到一把后,不可以自由进入同一把所同步代码 公平 :争抢顺序,按照先来后到顺序 非公平 :争抢顺序,不按照先来后到顺序 Java几种重要实现方式:synchronized...要了解synchronized加锁在JVM是如何实现,就有必要了解Java对象在JVM到底是如何存储。我们知道JVM在方法区存储对象引用,在堆存储对象实例。...我们知道Java每个对象都会有一个对象监视器(Object Monitor, 即管程),而升级为重量级就需要用到这个Object Monitor。...偏向会偏向于第一个获得它线程,如果在接下来执行过程,该没有被其他线程获取,则持有偏向线程将永远不需要同步。

    39910

    深入理解Java(三)

    同一时间,两把不能被不同线程持有。读写适合读取操作多于写入操作场景,改进互斥性能,比如集合并发安全性改造,缓存组件等。...值,如果readCount为0说明读未被占用 然后判断writeCount值,如果writeCount为0,说明写未被占用 然后通过CAS操作进行抢将writeCount值加1,如果抢到则将...,即降级 如果写不是被当前线程占用,则将线程放入等待队列 当有写线程释放时,会将writeCount值减1,如果writeCount值为0,则将owner设为null同时唤醒等待队列头部线程出队列进行抢操作...waiters.poll(); // 将当前线程从队列移除 WaitNode next = waiters.peek(); if (next !...降级指的是写降级为读,是指持有写同时,再获取读,随后释放写过程。

    40120

    Java

    点击上方 好好学java ,选择 星标 公众号 重磅资讯、干货,第一时间送达今日推荐:用好Java枚举,真的没有那么简单!...2.2、synchronized ★synchronized通过机制实现同步。 ” 先来看下利用synchronized实现同步基础:Java每一个对象都可以作为。...2.2.3 存放位置 标记存放在Java对象头Mark Word。 ? Java对象头长度 ? 32位JVM Mark Word 结构 ? 32位JVM Mark Word 状态变化 ?...image.png 2.3、CAS ★CAS,在Java并发应用通常指CompareAndSwap或CompareAndSet,即比较并交换。...3、Java实现 3.1、队列同步器(AQS) ★队列同步器AbstractQueuedSynchronizer(以下简称同步器),是用来构建或者其他同步组件基础框架。

    1.1K31

    Java

    ---- 欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者微信公众号:朱小厮博客。...---- 欢迎跳转到本文原文链接:https://honeypps.com/java/locks-in-java/ 在学习或者使用Java过程中进程会遇到各种各样概念:公平、非公平、自旋...这里整理了Java各种,若有不足之处希望大家在下方留言探讨。 WARNING:本文适合有一定JAVA基础同学阅读。...##自旋 Java线程是映射到操作系统原生线程之上,如果要阻塞或唤醒一个线程,都需要操作系统来帮忙完成,这就需要从用户态转换到核心态,因此状态装换需要耗费很多处理器时间,对于代码简单同步块...---- 参考资料 《深入理解Java虚拟机》周志明著 《Java并发编程艺术》方腾飞等著 Java对象大小内幕浅析 JVM内部细节之一:synchronized关键字及实现细节(轻量级Lightweight

    37520

    Java

    下面我们看一下Lock接口提供方法,便于更好阅读,请读者可先查看java.util.concurrent.locks.Lock源码,跟着源码注释一起理解接口中方法。...2.7.2 队列同步器AQS 本章节是介绍Java,也可以换个说法是讲Java同步组件,典型代表有ReentrantLock、CountDownLatch、ReentrantReadWriteLock...2.7.3 显示 本小结介绍Java两个比较重要显示使用,一个是ReentrantLock,另一个是ReentrantReadWriteLock。...可能读者会有疑问,因为几乎所有资料都会把ReentrantLock视为重入,没错,从名字上看他确实是可重入性,之所以小标题使用显示是因为,我们知道在JAVAReentrantLock 和synchronized...重入,顾名思义,是有重入性,这里面有两个角色,一个是谁可以重新进入,另一个是他可以重新进入哪里。我们可以这样理解,重入是指线程在获取后可以在此获取到该而不会被阻塞特性,称为重入性。

    33830

    Java

    讨论J.U.C包locks下面的类(包括接口) 主要是用来控制多个线程访问共享资源一种方式,通常情况下,一个可以防止在同一时间内多个线程同时访问共享资源(读写除外,读写锁在同一时间内...公平与非公平获取:公平指的是在绝对时间上,先对进行请求线程(等待时间最长线程优先获取)首先获取,那么这个是公平,反之,则是非公平。 ①....重进入 如果要实现重进入,那么就就绪解决两个问题: 获取:要获取,那么就需要去检查获取该线程是否是已获取此线程(也就是是否是当前线程占有此),如果是,那么获取成功;如下代码是非公平获取方式...,在这段代码,仅仅在if条件多了一个hasQueuedPredecessors()方法,此方法就是判断在同步队列,当前节点是否有前驱节点(即有比当前线程更早获取线程),因此当hasQueuedPredecessors...LockSupport类 LockSupport类位于在J.U.C.locks包,它主要是定义了一些公共静态方法,这些方法提供了最基本线程阻塞和唤醒功能。

    59490

    Java

    乐观 认为自己在使用数据时不会有别的线程修改数据或资源,所以不会添加锁。 在Java是通过使用无编程来实现,只是在更新数据时候去判断,之前有没有别的线程更新了这个数据。...如果这个数据已经被其他线程更新,则根据不同实现方式执行不同操作,比如放弃修改、重试抢等 判断规则 版本号机制Version 最常采用是CAS算法,Java原子类递增操作就通过CAS自旋实现...是当前对象this,被锁定后,其他线程都不能进入到当前对象其他synchronized方法 类普通方法和同步方法无关 new 两个对象后,就不是同一把了 类静态同步方法 对于普通同步方法...如果是1个有synchronized修饰递归调用方法,程序第二次进入被自己阻塞了那岂不是无解了 所以JavaRenntrantLock和synchronized都是可重入,可重入一个优点是可以定成都避免死锁...在Java虚拟机(HotSpot),monitor是ObjectMonitor实现

    25410

    java redis_JavaRedis实现

    大家好,又见面了,我是你们朋友全栈君。 由于具体业务场景需求,需要保证数据在分布式环境下正确更新,所以研究了一下Java中分布式实现。...Java分布式实现方式主要有以下三种: 数据库实现乐观 Redis实现分布式 Zookeeper实现分布式 其中,较常用是前两种方式,但是数据库实现方式需要较多数据库操作,所以最终选择是用...而当这个key在redis已有记录时,则不会重新插入记录,这样的话,便可以实现分布式基本功能。且为其设置过期时间,并加入UniqueIdcheck,避免了上述提及两个问题。...上述解锁代码,在解锁之前先验证了UniqueId,然后采用del方法来释放,但是由于get和del是两次请求,而不是一个原子操作,所以这之间仍存在并发问题。...在有些较看重数据正确性场景,即使Redis超时,只要检测到机器仍在正常运行Redis就不应该被释放,而应该被续期,这些,都是redis锁在更复杂场景中所需要考虑。留待以后继续研究。

    2K20

    java 读写_Java读写「建议收藏」

    一、读写 1、初识读写 a)Java——Lock和synchronized中介绍ReentrantLock和synchronized基本上都是排它,意味着这些锁在同一时刻只允许一个线程进行访问...并发包对ReadWriteLock接口实现类是ReentrantReadWriteLock,这个实现类具有下面三个特点 ①具有与ReentrantLock类似的公平和非公平实现:默认支持非公平...这个特点也在源码实现。 c)写writeLock ①上面说到过,读写是支持重入,而对于写而言还是排他,这样避免多个线程同时去修改临界资源导致程序出现错误。...③写释放源码 写释放和ReentrantLock释放思路基本相同,从源码可以看出来,每次释放都是减少写状态,直到写状态值为0(exclusiveCount(nextc) == 0)时候释放写...在同一时刻竞争队列,如果没有写线程想要获取读写,那么读总会被读线程获取到(然后更新读状态值)。每个读线程都可以重入获取读,而对应获取次数保存在本地线程,由线程自身维护该值。

    2.9K20

    Java偏向

    偏向和轻量级一样也是在JDK 1.6新增一种,它目的是为了解决数据在无竞争时候把同步语句去掉,进一步提高程序运行性能。...偏向实际本质是就是偏向第一个获得它线程,当这个线程在执行时,如果该没有被其他线程获取,则持有偏向线程将一直不需要进行同步。...下面我们看一下在线程获取偏向时,Mark Word都会有哪些变化。 当线程第一次获取时,虚拟机会把Mark Word标志位修改为01,即偏向模式。...同时用CAS操作把获取到这个线程记录在对象Mark Word之中。如果CAS操作成功,那么持有偏向线程每次在执行同步代码块时,虚拟机都不会进行任何同步操作。...也就是不会调用同步相关字节码指令等。当有其它线程尝试去获取这个时,偏向模式也就结束了。下图为偏向和轻量级转化时对象Mark Word等信息变化。

    48720

    Java分类

    在读很多并发文章,会提及各种各样如公平,乐观等等,这篇文章介绍各种分类。...互斥锁在Java具体实现就是ReentrantLock 读写锁在Java具体实现就是ReadWriteLock 乐观/悲观 乐观与悲观不是指具体什么类型,而是指看待并发同步角度。...从上面的描述我们可以看出,悲观适合写操作非常多场景,乐观适合读操作非常多场景,不加锁会带来大量性能提升。 悲观锁在Java使用,就是利用各种。...乐观锁在Java使用,是无编程,常常采用是CAS算法,典型例子就是原子类,通过CAS自旋实现原子操作更新。...自旋Java,自旋是指尝试获取线程不会立即阻塞,而是采用循环方式去尝试获取,这样好处是减少线程上下文切换消耗,缺点是循环会消耗CPU。

    93620

    java分类

    java分类 java 公平/非公平 公平是指多个线程按照申请顺序来获取。 非公平是指多个线程获取顺序并不是按照申请顺序,有可能后申请线程比先申请线程优先获取。...互斥锁在Java具体实现就是ReentrantLock 读写锁在Java具体实现就是ReadWriteLock 乐观/悲观 悲观是悲观认为,不加锁并发操作一定会出问题 乐观则认为对于同一个数据并发操作...从上面的描述我们可以看出,悲观适合写操作非常多场景,乐观适合读操作非常多场景,不加锁会带来大量性能提升。 悲观锁在Java使用,就是利用各种。...乐观锁在Java使用,是无编程,常常采用是CAS算法,典型例子就是原子类,通过CAS自旋实现原子操作更新。...自旋Java,自旋是指尝试获取线程不会立即阻塞,而是采用循环方式去尝试获取(比如cas),这样好处是减少线程上下文切换消耗,缺点是循环会消耗CPU。

    47120

    Java分类

    Java分类一、介绍在Java可以分为以下这四类可重入、不可重入乐观、悲观公平、非公平互斥、共享二、详解1)可重入、不可重入当一个线程持有一个后,又想再持有这个时,发生情况...如果数据未被修改,乐观会直接进行更新。常见乐观实现包括版本号机制和CAS机制。JavaAtomic相关类,底层正是使用CAS。...在Java,synchronized和Lock相关类都属于悲观。他们主要区别是,由于悲观会造成占用和线程切换,故占用较大。...非公平:不管先来后到,线程统一进行竞争,有CPU调度进行分配。Javasynchronized就是一款非公平,而Lock两者皆可,是可以进行设置。...4)互斥、共享锁线程持有后,其他线程同时持有这把,通过这样特性进行区分互斥:不同线程不能同时持有同一把共享:不同线程允许同时持有同一把锁在Java,synchronized关键字就是一把互斥

    7100
    领券