随笔
文章平均质量分 66
匣与桔
你有多努力就有多优秀。加油!
展开
-
死磕并发之先行发生原则(happens-before)
程序次序原则:在一个线程内,按照程序代码顺序,书写在前面的操作先行发生于书写后面的操作。准确的说,应该是控制流顺序而不是程序代码顺序,因为要考虑分支、循环等结构。程序锁定规则:一个unlock操作先行发生于后面对同一个锁的lock操作。这里必须强调的是同一个“锁”,而“后面”是指时间上的先后顺序。volatile变量规则:对一个volatile变量的写操作先行发生于后面对这个变量的读操作,这...原创 2020-05-04 23:37:24 · 191 阅读 · 0 评论 -
死磕并发之volatile关键字详解
volatile关键字可以说是java虚拟机提供的最轻量级的同步机制。当一个变量定义为volatile之后,它将具备两种特性:保证此变量对所有线程的可见性。“可见性”是指当一条线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的。普通变量和volatile关键字修饰的变量都是依赖主内存作为传递媒介的方式实现可见性的。唯一的区别就是: volatile修饰的变量保证每次修改后...原创 2020-05-04 23:35:01 · 198 阅读 · 0 评论 -
死磕并发之java内存模型(JMM)
了解虚拟机的并发问题之前我们首先先了解下物理机对并发的处理方案由于计算机的存储设备与处理器的运算速度有几个数量级的差距(也就是内存和cpu的差距),所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存来作为内存与处理器之间的缓冲:将运算需要使用到的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存同步回内存中,这样处理器就无须等待缓慢的内存读写了。处...原创 2020-05-04 23:29:54 · 152 阅读 · 0 评论 -
死磕并发之线程池核心参数
为什么要用线程池呢?虽然创建线程看起来很简单,只需要new Thread()就可以了,但实际上创建线程远不止创建一个对象这么简单。创建对象,仅仅是在堆内存中分配一块内存而已,而创建线程则需要调用操作系统内核API,然后操作系统要为线程分配一系列的资源,这个成本比创建一个对象时要高很多的。所以线程是一个重量级的对象,应避免频繁创建和销毁。线程池几个核心参数corePoolSiz...原创 2020-04-24 22:03:22 · 223 阅读 · 0 评论 -
死磕并发之ReadWriteLock读写锁的使用
所有读写锁都要遵循以下三条基本原则:允许多个线程同时读共享变量。只允许一个线程写共享变量。如果一个线程正在执行写操作,此时禁止读线程读共享变量。总结: 读-读可以,读-写互斥,写-写互斥。注意:写锁可降级为读锁,读锁不能升级为写锁。简单使用示例public class ReentranReadWriteLokeDemo<K, V> { priva...原创 2020-04-22 22:45:58 · 456 阅读 · 0 评论 -
死磕并发之Semaphore的使用
Semaphore的模型可以简单的概括为:一个计数器,一个等待队列,三个方法。在信号量模型里,计数器和等待队列对外是透明的,所以只能通过信号量模型提供的三个方法来访问它们,这三个方法分别是:init()、down()、up()init():设置计数器初始值。down():计数器的值减 1;如果此时计数器的值小于 0,则当前线程将被阻塞,否则当前线程可以继续执行。up():计数器...原创 2020-04-22 22:22:33 · 151 阅读 · 0 评论 -
死磕并发之CyclicBarrier的使用
CyclicBarrier和CountDownLatch的不同是CyclicBarrier的计数器有自动重置的功能CyclicBarrier有提供回调函数的功能,当计数器减到0时,会调用这个回调函数。简单使用例子:public class CyclicBarrierDemo { static CyclicBarrier cyclicBarrier = new ...原创 2020-04-22 22:20:26 · 332 阅读 · 0 评论 -
死磕并发之CountDownLatch的使用
CountDownLatch和join的作用类似。joinThread.join()方法使线程等待,待线程退出时,调用Thread.join()的主线程会被唤醒,从而执行后续操作。当处于线程池的状态下,线程不会退出,join就会一直执行不到。如下示例,会先输出“执行结束”,然后输出 “Child thread running”public class ThreadJoinD...原创 2020-04-22 22:18:09 · 182 阅读 · 0 评论 -
Mysql的隔离级别
为什么要有隔离级别?当数据库有多个事务同时执行的时候,就可能出现脏读、不可重复读、幻读的问题,为了解决这些问题,就有了隔离级别脏读:事务a修改了数据,但是a事务还未提交,此时事务b读取到了事务a修改的操作。不可重复读:事务A在事务B提交前读取到的结果和事务B提交后的结果不一致。幻读:select查询a不存在,执行insert操作,发现a已存在,无法插入。mysql的个隔离级别包...原创 2020-02-22 22:55:50 · 156 阅读 · 0 评论 -
zookeeper的基础知识
1.什么是zookeeper?简介:Zookeeper是一个分布式开源框架,提供了协调分布式应用的基本服务,它向外部应用暴露一组通用服务——分布式同步(Distributed Synchronization)、命名服务(Naming Service)、集群维护(Group Maintenance)等,简化分布式应用协调及其管理的难度,提供高性能的分布式服务。ZooKeeper本身可以以单机模式...原创 2019-07-05 21:22:13 · 259 阅读 · 0 评论 -
SpringBoot配置多数据源
1.数据库表结构CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `age` int(20) NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=...原创 2019-06-12 21:46:33 · 160 阅读 · 0 评论 -
SpringMVC执行流程
1.用户发送请求至DispacherServlet。2.DispacherServlet收到请求调用HandlerMapping处理器映射器。3.处理器映射器根据请求url找到具体的处理器,生出处理器对象及处理器拦截器,一并返回给DsipacherSerlvet4.DispacherServlet通过HandlerAdadapter处理器适配器调用处理器。5.执行处理器(即Co...原创 2019-05-07 20:44:37 · 217 阅读 · 0 评论 -
Spring随笔
1.什么是AopAop是面向切面编程。2.为什么要使用Aop代码解耦、减少代码冗余、提高代码复用。3.Aop的一些应用场景日志、事务、权限等...4.Aop的核心在方法执行之前或者执行之后处理事情。5.spring的事务机制spring的事务是基于Aop的环绕通知来实现的。6.aop的底层实现机制通过代理设计模式进行实现代理设计模式分为静态代理、jd...原创 2019-04-29 19:57:00 · 93 阅读 · 0 评论 -
ArrayList、vector、LinkedList的区别你真的知道吗?
ArrayList:1.底层是数组。2.查询遍历快。 根据下标进行取值。3.添加慢。 添加时需要进行扩容,默认数组长度为10,扩容每次扩容1.5倍(扩容计算公式:旧的容量+(旧的容量 >> 1))。 如果知道要添加多少元素,指定集合大小效率会提高。4.删除慢。 根据下标删除时,需要移动后面的所有元素。通过arraycopy(Objec...原创 2019-04-19 22:21:45 · 197 阅读 · 0 评论 -
arraycopy()的简单使用
源码:public static native void arraycopy(Object src, int srcPos, Object dest, int destPos,int length);参数: src:要复制的数组(源数组) srcPos:复制源数组的起始位置 dest:目标数组 destPos:目标数组的下标位置 leng...原创 2019-04-17 20:23:58 · 51475 阅读 · 2 评论 -
基于jdk1.7的HashMap
1.HashMap参数:DEFAULT_INITIAL_CAPACITY 默认大小为16DEFAULT_LOAD_FACTOR 加载因子,默认为0.752.HashMap扩容机制1.size > (DEFAULT_INITIAL_CAPACITY *DEFAULT_LOAD_FACTOR) = 12,默认情况下,当map容量大于12的情况下进行扩容。每次扩容为当前集合大...原创 2019-04-25 21:29:24 · 167 阅读 · 0 评论