AbstractQueuedSynchronizer框架

作者:JerryXia | 发表于 , 阅读 (0)
日常开发中,大多数程序员并不会直接接触AbstractQueuedSynchronizer(AQS)类,但其在并发工具中缺无处不在,并作为内部的标准同步器,如ReentrantLock,Semaphore,Java线程池中的Worker等。本文将介绍AQS相关的实现细节。
什么是AbstractQueuedSynchronizer(AQS)AQS负责管理同步器类中的状态,它管理了一个整数状态信息,可以通过getState,setState及compareAndSetState等方法进行操作。这个整数状态的意义由子类来赋予,如ReentrantLock中该状态值表示所有者线程已经重复获取该锁的次数,Semaphore中该状态值表示剩余的许可数量。可以看下使用的AbstractQueuedSynchronizer的并发工具类:
AbstractQueuedSynchronizer(AQS)实现AQS定义比较简单,继承自AbstractOwnableSynchronizer接口:
AbstractOwnableSynchronizer当一个同步器可以由单个线程独占时,AbstractO...阅读全文

结算服务中的事务和一致性处理

作者:JerryXia | 发表于 , 阅读 (0)
原子性(Atomicity): 一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性(Consistency): 在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
隔离性(Isolation 两个或者多个事务并发访问(此处访问指查询和修改的操作)数据库的同一数据时所表现出的相互关系。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
持久性(Durability 在事务完成以后,该事务对数据库所作的更改便持久地保存在数据库之中,并且是完全的。
...阅读全文

理解Java内存模型

作者:JerryXia | 发表于 , 阅读 (0)
2016 年 01 月 10 日javaJava Memory Model(Java内存模型,简称JMM),作为Java语言规范的一部分(主要在JLS的第17章节介绍),其定义了多线程之间如何通过内存进行交互,在旧的JMM中,存在一些不够明确和过于限制的问题,比如对final,volatile等关键字的语义约束问题,例如,有可能出现final字段的值会发生变化,或者阻止编译器的优化操作,还有比较熟知的double-checked问题,于是在新的JMM中,针对这一系列问题作出了修订,最终在JSR133中进行了详细描述,本文将对Java内存模型作一番理解。
什么是Java内存模型(Java Memory Model)在多核系统中,处理器通常会有一层或多层缓存,通过这些缓存可以加快数据访问(缓存数据距处理器更近)和降低共享内存总线上的通讯(因为本地缓存能够满足大多数内存操作)来提高CPU性能。缓存能够大大提升性能,但这同时也带来了许多挑战。例如,当两个CPU同时检查相同的内存地址时会发生什么?在什么样的条件下它们会看到相同的值?
在处理器层面上,JMM定义了一个充要条件: 让当前的处理器...阅读全文

Flaway数据库迁移工具

作者:JerryXia | 发表于 , 阅读 (0)
在日常开发中, 经常由于hotfix或者feature需要对数据库表进行更新, 很难人工去把控DB的变更, 难免可能出现问题, Flyway也许能帮助我们.Flyway支持多种使用方式: 如命令行Java API,Maven,Gradle等,并支持常用的数据库:Oracle,MySQL,MariaDB,H2等.
平时build多用Maven, 使用时需要做一些基本的插件配置<plugin><groupId>org.flywaydb</groupId><artifactId>flyway-maven-plugin</artifactId><version>3.1</version><configuration><url>jdbc:mysql://127.0.0.1:3306/gaara</url><user>root</user><password>root</password><locations><location>filesystem:${project.basedir}/db</location></locations><table>schema_history</table>...阅读全文

C3p0连接配置问题

作者:JerryXia | 发表于 , 阅读 (0)
在日常开发中,经常会涉及到数据库读写访问,对数据库访问通常会通过数据库连接池来获取数据库连接,再进行SQL,最近涉及到迁移数据,在日志中偶尔出现一些MySQL数据库连接错误,通过DB配置和连接池配置最终解决。
服务器日志中的错误信息大致如:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failureThe last packet successfully received from the server was 20,024 milliseconds ago.  The last packet sent successfully to the server was 14 milliseconds ago.at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeCo...阅读全文