ReentrantReadWriteLock源码分析 简介ReentrantReadWriteLock分为读锁和写锁两个实例,读锁是共享锁,可被多个读线程同时使用,写锁是独占锁。持有写锁的线程可以继续获取读锁,反之不行。 Doug Lea 将持有写锁的线程,去获取读锁,之后释放读锁,最后释放写锁,从写锁降级为读锁的过程称为锁降级(Lock downgrading)。 但是,锁升级是不可以的。线程持有读锁的话,在没释放的情况下不能去获取写锁,因为会发生 2020-11-22 Java > Java并发 #Java #并发
ReentrantLock源码分析 简介相对于synchronized关键字,ReentrantLock具备以下特点: 可中断 可设置超时时间 可设置为公平锁 支持多个条件变量 源码实现可重入锁的实现上,主要关注两点: 可重入线程的再次获取锁的处理 可重入锁的释放机制 类的继承关系ReentrantLock实现了Lock接口,Lock接口定义了锁的通用方法。 public class ReentrantLock impl 2020-11-20 Java > Java并发 #Java #并发
《程序员练级攻略》 阅读总结 前言 陈皓叔叔的这个专栏之前就有所耳闻并大致过了一遍,如今重新精读本专栏,认真学习,对整体的学习方向进行把握,并且进行总结。 如何入门? 学习Python,JavaScript,学习使用操作系统Linux,编程工具VS Code,Web开发等,这些更容易获得编程的成就感。 如何成为专业的程序员? 拥有程序员的自我修养。这是反映出程序员的工程师特质和价值观,决定了这条路你到底能走多远。有修养的程 2020-11-17 随笔
秒杀系统设计总结 简介 秒杀从规模上可以分为以下两类: 大秒:类似双十一,商品数量规模大,价格低,流量超大的活动。 小秒:商家自己配置的一些时段类型的活动,由商家自己指定时间上架。 秒杀系统面对的问题 秒杀系统本质上就是一个满足大并发、高性能和高可用的分布式系统。 高并发环境下的系统稳定性:如何保证系统在面对巨大的流量情况下,不被打崩? 两个问题 并发读 核心优化理念:减少用户到服务端来读数据。或者让他们 2020-11-09 系统设计 #系统设计
LockSupport源码分析 简介 Basic thread blocking primitives for creating locks and other synchronization classes. – Java Doc LockSupport是用来创建锁和其它同步类的基本线程阻塞原语。底层依赖Unsafe实现,我们可以在其它的并发同步工具类的实现中看到该类的使用。LockSupport提供了park()和un 2020-11-08 Java > Java并发 #Java #并发
Java原子类的使用与实现 简介通常情况下,在Java中,++i这类自增/自减运算符在并发环境中不能保证并发安全。需要通过加锁才能解决并发环境下的原子性问题。Atomic原子类通过CAS方式来解决线程安全问题,CAS是一种无锁算法(乐观锁),乐观锁多用于“读多写少“的环境,避免频繁加锁影响性能;而悲观锁多用于”写多读少“的环境,避免频繁失败和重试影响性能。 Atomic原子类分为以下几类: 基本类型:Atomic 2020-10-29 Java > Java并发 #Java #并发
volatile关键字剖析 定义 The Java programming language allows threads to access shared variables (§17.1).As a rule, to ensure that shared variables are consistently and reliably updated, a thread should ensure that it has 2020-10-24 Java > Java并发 #Java #并发
synchronized关键字剖析 使用在使用Synchronized关键字需要把握以下注意点: 一把锁只能同时被一个线程获取,没有获得锁的线程只能等待。 每一个实例都有自己的一个锁资源,存放于对象头中(2bit表示锁信息) 对象锁 同步代码块锁(可以指定锁定对象) 方法锁(默认锁定对象为this(当前实例对象)) public void test() { synchronized (obj){ 2020-10-11 Java > Java并发 #Java #并发