
多线程
dayday_14056891
这个作者很懒,什么都没留下…
展开
-
多线程-synchronized锁升级过程
synchronized底层原理 synchronized是基于JVM内置锁实现,通过内部对象Monitor(监视器锁)实现,基于进入与退出Monitor对象实现方法与代码块同步,监视器锁的实现依赖底层操作系统的Mutex lock(互斥锁)实现,它是一个重量级锁性能较低。 JVM内置锁在1.5之后版本做了重大的优化,如锁粗化(Lock Coarsening)、锁消除(Lock Elimination)、偏向锁(Biased Locking)、轻量级锁(Lightweight Locking)、适应性自旋(原创 2020-12-24 21:53:50 · 451 阅读 · 0 评论 -
多线程-CAS
乐观锁和悲观锁 多线程的并发操作可能会引发并发安全问题。实现并发控制的主要手段可以分为两种:乐观并发控制和悲观并发控制,即乐观锁和悲观锁。 悲观锁:对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度。因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁具有强烈的独占和排他特性。 乐观锁:假设数据一般情况下不会发生冲突,只在提交操作时检查是否违反数据完整性。乐观锁机制采取了更加宽松的加锁机制。 乐观锁的实现 CAS实现 CAS实现会遇到ABA问题:其他线程修改数次最后值和原创 2020-12-21 21:56:39 · 315 阅读 · 1 评论 -
多线程-对象内存布局
根据java虚拟机规范对堆(Heap)内存的描述,所有的实例对象都在堆上分配内存。对于一个实例对象而言,其本身的内在结构也是有描述方式的,也就是接下来提到的对象内存布局。 对象内存布局 一个java对象在内存中包括对象头,实例数据和对齐三个部分。 对象头 对象头包括两部分:标记位(Mark word)和类指针(Class pointer) 标记位(Mark word):包含一系列的标记位信息,比如锁标识为信息,在内存中占8字节。 类指针(Class pointer):用来指向对象对应的Class对象的地址原创 2020-12-06 21:06:09 · 262 阅读 · 0 评论 -
多线程-死锁
死锁的定义: 两个或多个线程互相持有对方所需的资源,这些线程会互相等待对方释放资源,如果线程都不主动释放所占有的资源,这些线程都会处于等待状态,无法继续执行,产生死锁 死锁产生的条件: 互斥条件:线程对所分配的资源具有排他性,即一个资源只能被一个线程占用,知道该线程释放该资源; 请求和保持条件:一个线程因请求被占用资源而发生阻塞时,对已获得的资源保持不放; 不剥夺条件:任何一个备战有的资源在没被该线程释放之前,任何其他线程都无法对他进行剥夺占用; 循环等待条件:当发生死锁时,所等待的线程必定会形成一个原创 2020-11-29 17:13:04 · 134 阅读 · 0 评论 -
多线程-java中的锁
当多个线程同时对共享数据进行操作时,可能会引发线程安全问题。解决多线程的并发安全问题,主要方法是加锁。在java中,加锁有两个方法,即synchronized和Lock. synchronized方法 Synchronized是java的关键字,该关键字可以作用于同步代码块和同步方法,被synchronized修饰的代码具有原子性和可见性。 synchronized作用于同步代码块 synchronized ( 同步监视器 ) { //操作共享数据的代码 } 同步监视器:即锁,任何一个对象都可以原创 2020-12-03 22:11:54 · 158 阅读 · 0 评论