目录

hymn

忽有故人心头过,回首山河已是秋。

dubbo 并发配置

并发控制 executes:每个客户端最大并发线程的配置(只有提供段) actives:每个客户端最大占用请求数 服务连接配置 accepts:提供端最大的连接数 connettions:消费端最大的连接数

Java 1.8扩容机制怎么确定当前元素在原位置还是原位置+原下标

扩容后新增的那个参与与运算的位是0还是1, 0:原位置,1:原位置加原长度 为什么? 因为扩容后,hashmap的长度变为之前的2倍,长度的位多了一位,比如之前16,是1 0000,扩容后变为32,是10 0000, 而计算key的下标是key的hash值 与(&)长度减一,假如key 的hash值是10,二进制就是1010,下标就是 1010 & 1111,扩容后就是1010 & 1 1111, 就是参与计算 多出来的那个位 是0就是原位置,是1就是原位置加原长度

Java 异常

总体上我们根据Javac对异常的处理要求,将异常类分为2类。 非检查异常(unckecked exception):Error 和 RuntimeException 以及他们的子类。javac在编译时,不会提示和发现这样的异常,不要求在程序处理这些异常。所以如果愿意,我们可以编写代码处理(使用try...catch...finally)这样的异常,也可以不处理。对于这些异常,我们应该修正代码,而不是去通过异常处理器处理 。这样的异常发生的原因多半是代码写的有问题。如除0错误ArithmeticException,错误的强制类型转换错误ClassCastException,数组索引越界ArrayIndexOutOfBoundsException,使用了空对象NullPointerException等等。 检查异常(checked exception):除了Error 和 RuntimeException的其它异常。javac强制要求程序员为这样的异常做预备处理工作(使用try...catch...finally或者throws)。在方法中要么用try-catch语句捕获它并处理,要么用t....

spring事务传播机制整理

支持当前事务的情况: TransactionDefinition.PROPAGATION_REQUIRED: 如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。 TransactionDefinition.PROPAGATION_SUPPORTS: 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。 TransactionDefinition.PROPAGATION_MANDATORY: 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。(mandatory:强制性) 不支持当前事务的情况: TransactionDefinition.PROPAGATION_REQUIRES_NEW: 创建一个新的事务,如果当前存在事务,则把当前事务挂起。 TransactionDefinition.PROPAGATION_NOT_SUPPORTED: 以非事务方式运行,如果当前存在事务,则把当前事务挂起。 TransactionDefinition.PROPAGATION_NEVER: 以非事务方式运行,如果当前存在事务,则抛出异常。 ....

重新理解MySQL的事务、redo log、undo log,bin log、MVCC、间隙锁、快照读、当前读 有更新!

MySQL 事务,四个特性 原子性 一致性 持久性:通过redolog实现,事务的修改会先放到buffer pool(内存),redolog(磁盘,顺序写)中,提交事务后会慢慢刷到磁盘,当服务器在刷到磁盘钱宕机了,重启后会通过redolog重新写。 隔离性: 读未提交:脏读,不可重复度,幻读 读提交:不可重复度,幻读 可重复度: 串行话: 脏读:读取到事务没有提交的数据 不可重复度:事务中几次读取到数据不一致,数据被修改 幻读:事务中几次读取到数据不一致,数据增加或者删除 读提交解决了脏读,在事务修改时加排他锁,读事务无法读取到为提交的数据 可重复读解决了,脏读,不可重复读,幻读,通过MVCC和间隙锁 RR隔离级别下: MySQL的innodb在数据的后面增加了两列隐藏列,一个是DB_TRX_ID,一个是DB_ROLL_PTR DB_TRX_ID:事务插入时的事务id DB_ROLL_PTR:事务删除数据行时,会把当前的事务id放到这里 可重复读:事务读取时, DB_TRX_ID: 会读取数据中事务id小于等于当前事务id的数据,因为小于等于当前事务id的数据行,代表数据行时在事....

负数 有更新!

计算机中表示正数 比如 6 :0000 0110 负数 在正数的基础上取反加一就是计算机表示负数的方式 比如 -6: 6:0000 0110 取反:1111 1001 加一:1111 1010 这就是计算机表示负数的值 怎么快速判断 计算机中表示的数是几 假如 :1111 1010 是表示的是十进制中的几 方法:设 最右边1的位置为 k ,k之前的数取反,得到:0000 0110 表示 6,所以 1111 1010 这个数表示的是 -6

线程池状态 有更新!

ThreadPoolExecutor继承了AbstractExecutorService,成员变量ctl是一个Integer的原子变量,用来记录线程池状态和线程池中线程个数,类似于ReentrantReadWriteLock使用一个变量来保存两种信息。

java 并发队列总结 有更新!

ConcurrentLinkedQueue 无界非阻塞队列,底层用单链表实现,出队和入队用cas实现。 LinkedBlockingQueue 底层用单链表实现,有界,独占锁实现出队和入队,有两个锁,takeLock和putLock takeLock:控制同时只能有一个线程可以从队头获取元素,其他线程等待 putLock:控制同时只能有一个线程可以从队尾添加元素,其他线程等待 ArrayBlockingQueue 底层数组实现,通过锁实现出队和入队,有界(可以指定,默认Integer.Max_VALUE) PriorityBlockingQueue 带有优先级的无界队列,底层通过二叉树堆实现, DelayQueue 通过 PriorityBlockingQueue来装数据,只有过期的数据才会出队。

AQS 有更新!

AbstractQueuedSynchronizer抽象同步队列简称AQS,它是实现同步器的基础组件,并发包中锁的底层就是使用AQS实现的 AQS是一个FIFO的双向队列,其内部通过节点 head和 tail记录队首和队尾元素,队列元素的类型为 Node。 其中 Node中的 thread变量用来存放进入AQS队列里面的线程; Node节点内部的 SHARED用来标记该线程是获取共享资源时被阻塞挂起后放入AQS队列的, EXCLUSIVE用来标记线程是获取独占资源时被挂起后放入AQS队列的; waitStatus记录当前线程等待状态,可以为 CANCELLED(线程被取消了)、SIGNAL(线程需要被唤醒)、CONDITION(线程在条件队列里面等待)、PROPAGATE(释放共享资源时需要通知其他节点); prev记录当前节点的前驱节点,next记录当前节点的后继节点。 在AQS中维持了一个单一的状态信息 state,可以通过 getState、setState、compareAndSetState函数修改其值。 对于 ReentrantLock的实现来说,state可以用来表示....

随笔(思考) 有更新!

随笔,随想,思考