![](https://img-blog.csdnimg.cn/20200616173518664.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java成神之路
hollischuang.gitee.io/tobetopjavaer/#/menu
RachelGods
这个作者很懒,什么都没留下…
展开
-
synchronized
synchronized和Lock之间的关系 1、synchronized用于少量同步上,ReentrantLock用于大量同步。 2、synchronized是在JVM层面上实现同步的,系统可以监控锁;ReentrantLock使用代码实现。 3、synchronized线程执行发生异常,JVM会让线程释放锁;ReentranLock在finally中必须释放锁,不然容易造成线程死锁。 4、synchronized当线程a获得锁的时候,线程b会处于等待状态;ReentranLock有锁投票,定时锁等候和原创 2020-06-26 18:45:31 · 137 阅读 · 0 评论 -
synchronized是如何实现的?
在再有人问你Java内存模型是什么,就把这篇文章发给他。中我们曾经介绍过,Java语言为了解决并发编程中存在的原子性、可见性和有序性问题,提供了一系列和并发处理相关的关键字,比如synchronized、volatile、final、concurren包等。 在《深入理解Java虚拟机》中,有这样一段话: synchronized关键字在需要原子性、可见性和有序性这三种特性的时候都可以作为其中一种解决方案,看起来是“万能”的。的确,大部分并发控制操作都能使用synchronized来完成。 海明威原创 2020-06-26 18:40:43 · 410 阅读 · 1 评论 -
死锁
死锁的定义 在多道程序系统中,由于多个进程的并发执行,改善了系统资源的利用率并提高了系统 的处理能力。然而,多个进程的并发执行也带来了新的问题——死锁。所谓死锁是指多个进 程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。 下面我们通过一些实例来说明死锁现象。 先看生活中的一个实例,在一条河上有一座桥,桥面很窄,只能容纳一辆汽车通行。如 果有两辆汽车分别从桥的左右两端驶上该桥,则会出现下述的冲突情况。此时,左边的汽车 占有了桥面左边的一段,要想过桥还需等待右边的汽车让出桥面原创 2020-06-26 18:40:13 · 132 阅读 · 0 评论 -
什么是死锁
什么是死锁 java级别死锁 一、什么是死锁 死锁不仅在个人学习中,甚至在开发中也并不常见。但是一旦出现死锁,后果将非常严重。 首先什么是死锁呢?打个比方,就好像有两个人打架,互相限制住了(锁住,抱住)彼此一样,互相动弹不得,而且互相欧气,你不松手我就不松手。好了谁也动弹不得。 在多线程的环境下,势必会对资源进行抢夺。当两个线程锁住了当前资源,但都需要对方的资源才能进行下一步操作,这个时候两方就会一直等待对方的资源释放。这就形成了死锁。这些永远在互相等待的进程称为死锁进程。 那么我们来总结一下死锁产原创 2020-06-26 18:37:43 · 272 阅读 · 0 评论 -
锁优化
在JDK1.6以后,为了减少消耗,锁进行了很多的升级。并且有了四种状态,从低到高 无锁状态 偏向锁状态 轻量级锁状态 重量级锁状态 下面就介绍一下这四种不同等级的锁 不同等级间的锁可以进行升级,但是不能进行降级 对象内存布局 在讲锁之前我们应该了解对象的内存布局,因为后面锁的判定时需要用到, 该内容可以看我的这篇文章,对象的内存布局,重点看对象头中的运行时数据(Mark Word) 看了这个你应该知道,Mark Word(以后简称MW) 会随着 标志位的变化而变化 MW变化 先把他放出来,免得等原创 2020-06-26 18:36:54 · 154 阅读 · 0 评论 -
无锁
什么是CAS? 在计算机科学中,比较和交换(Conmpare And Swap)是用于实现多线程同步的原子指令。 它将内存位置的内容与给定值进行比较,只有在相同的情况下,将该内存位置的内容修改为新的给定值。 这是作为单个原子操作完成的。 原子性保证新值基于最新信息计算; 如果该值在同一时间被另一个线程更新,则写入将失败。 操作结果必须说明是否进行替换; 这可以通过一个简单的布尔响应(这个变体通常称为比较和设置),或通过返回从内存位置读取的值来完成(摘自维基本科) 我的理解: (1)线程1读取出指.原创 2020-06-26 18:31:31 · 161 阅读 · 0 评论 -
锁
定义 可重入锁,也叫做递归锁,指的是在同一线程内,外层函数获得锁之后,内层递归函数仍然可以获取到该锁。换一种说法:同一个线程再次进入同步代码时,可以使用自己已获取到的锁。 作用 防止在同一线程中多次获取锁而导致死锁发生。 LockSupport.unpark()的阻塞锁。 该例子是将CLH锁修改而成。 阻塞锁的优势在于,阻塞的线程不会占用cpu时间, 不会导致 CPu占用率过高,但进入时间以及恢复时间都要比自旋锁略慢。 在竞争激烈的情况下 阻塞锁的性能要明显高于 自旋锁。 乐观锁原创 2020-06-26 18:30:19 · 157 阅读 · 0 评论