巧用CAS解决数据一致性问题[转载]

2017年7月22日 没有评论

这周不太忙的时候看了58到家沈剑老师的一系列的文章,感觉沈剑老师的文章做到了深入浅出,浅显易懂,看完收获很大,有些文章完美的解决了我一直一来的疑惑,所以转载到自己博客,希望对大家也有所帮助。

原文出处微信公众号:架构师之路,微信号:road5858,链接地址:http://mp.weixin.qq.com/s/_XlzbmBSj_i-S2PkE5tI_w

以下是原文:

缘起:在高并发的分布式环境下,对于数据的查询与修改容易引发一致性问题,本文将分享一种非常简单但有效的优化方法。

一、业务场景

业务场景为,购买商品的过程要对余额进行查询与修改,大致的业务流程如下:[……]

Read more

分类: Java 标签: , ,

程序猿的自我修养之开发规范

2017年7月9日 没有评论

有感于公司代码比较乱,完全没有规范,而我则受益于实习的时候的老大zeak的严格要求,看到这种情况表示有点难以接受,所以和老大讨论后,基于阿里的规范经过删减写了这么一个标准,今天发出来,不仅供自己时时对照,也供大家参考,最后感谢一下阿里出这份标准。

一、 编程规约

(一)命令风格

整体要求,见名知义,英文为主,类名一般是名称或者形容词,方法名为动词

具体要求:
1. 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。除非特殊情况最好不要用美元符号(大家猜猜为啥?)
2. 类名使用 UpperCamelCase 风格,必须遵从驼峰形式,但以下情形例[……]

Read more

分类: Java 标签: ,

ThreadLocal类之简单应用示例

2017年6月18日 1 条评论

在日常开发的系统中,日期处理是非常非常用的一个功能,处理的日期的时候就需要用到SimpleDateFormat对象,但是我们都知道SimpleDateFormat本身不是线程安全的(如果不知道的请看源码),所以就需要频繁创建SimpleDateFormat这个对象。但是我们知道创建这个对象本身不仅是很费时的,而且创建的这些对象存活期很短,导致内存中大量这样的对象需要被GC,所以我们自然而然的想到使用ThreadLocal来给每个线程缓存一个SimpleDateFormat实例,提高性能。下面是一个具体的实现的小例子,其实不仅针对SimpleDateFormat对象,对于数据库连接等等都可以这么[……]

Read more

ThreadLocal类之简单理解

2017年6月11日 没有评论

当年实习的时候,当时公司一个相当有经验的工程师zeak带我们,从他那第一次听说了ThreadLocal类,但由于自己基础薄弱,没有理解到底怎么回事,工作中也没有用过,就一直没有太放在心上,刚好这一段时间不太忙,仔细玩了一下,欢迎高手批评。
ThreadLocal,线程本地变量。他为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。简单理解就是,对于非线程安全的变量在线程内部共享不用每次都new,是一种空间换时间的做法。ThreadLocal类提供的几个方法:


	public T get() { }
	public void set(T value) {[......]

Read more

Java集合类ArrayList删除特定元素

2017年5月28日 1 条评论

前一段时间入职新公司,熟悉公司系统原有代码的时候,发现公司代码那个烂啊,系统能正常跑,都不能用侥幸来形容,就是创造了一个奇迹。因为里面不仅没有coding style,而且竟然有很明显的常识性错误。其中当我一眼指出最明显的早就应该出过问题的一个地方,项目组几乎所有成员,是的,几乎全部成员,都说这个还真不知道,涨知识了,那就是:Java集合类ArrayList删除特定元素。发现原来不是所有人都知道怎么做,这难道不是最基础的吗?唉,真不知道这些系统是怎么跑起来的。我们首先看两种错误的写法,第一种:


    @Test
    public void testRemove1() {[......]

Read more

关于synchronized用法的简单理解

2017年5月14日 2 条评论

synchronized 关键字既可以用于声明方法,也可以用于声明代码块,他们之间有什么区别呢?下面让我们逐一测试一下。
先看以第一个例子:


package demo;

public class SynchronizedDemo1 {

    public synchronized static void foo1() {
    }

    public synchronized static void foo2() {
    }
}

在这个例子中,foo1 和 foo2 是类的两个静态方法。在不同的线程中,这两个方法的调用时互斥的,不[……]

Read more

分类: Java 标签: ,

事务并发处理

2017年4月9日 没有评论

前几天和同事讨论,老夫自以为对事务有了一定的了解,但当讨论的时候发现还是有些说不明白,所以周末的时间,又看了一遍带我入门北京尚学堂马士兵老师关于事务的讲解,这次做一下笔记,以供以后忘了的时候查询方便。这里默认读者对事务的ACID都有了了解,直接说事务并发时可能出现的问题和数据库的事务隔离级别

1. 事务并发时可能出现的问题

说这个问题记得大学课堂上有一个很经典的例子就是:银行的存取款,这里也用这个例子说明(因为不知道wp博客怎么搞表格和怎么支持MD,所以就搞几张图片吧)

①. 第一类丢失更新(Lost Update)

第一类丢失更新

②. dirty read脏读(读到了另一个[……]

Read more

分类: MySQL 标签: , ,

Java GC之常见监控可视化工具总结(下)

2017年4月4日 没有评论

上一篇文章总结一下监控和分析的常见命令,那些是基础,但是有些同学看到命令行就害怕,所以这篇文件总计一下两个常用的可视化工具。

1. JConsole

JConsole工具在JDK/bin目录下,启动JConsole后,将自动搜索本机运行的jvm进程,不需要jps命令来查询指定。双击其中一个jvm进程即可开始监控,也可使用“远程进程”来连接远程服务器

进入JConsole主界面,有“概述”、“内存”、“线程”、“类”、“VM摘要”和”Mbean”六个页签:

内存页签相当于jstat命令,用于监视收集器管理的虚拟机内存(Java堆和永久代)变化趋势,还可在详[……]

Read more

分类: Java 标签: , , , ,

Java GC之常见监控与分析命令总结(上)

2017年3月19日 没有评论

上一篇文章简单写了几种常见的垃圾收集器的参数设置,设置参数的时候离不开对对系统进行监控和分析,所以总结一下监控和分析的常见命令。

1. jps:JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程

命令格式:


jps [options] [hostid]

hostid为RMI注册表中注册的主机名,其他常用参数如下:
-q:只输出LVMID,省略主类的名称
-m:输出虚拟机进程启动的时候传递给主类main()方法的参数
-l:输出主类的全名,如果进程执行的是jar包,输出jar路径
-v:输出虚拟机进程启动时[……]

Read more

分类: Java 标签: , ,

Java GC之常见垃圾收集器参数总结

2017年3月5日 没有评论

上一篇文章简单写了几种常见的垃圾收集器,俗话说,好记性不如烂笔头,今天总结一下这些垃圾收集器的参数总结,供自己和需要的读者将来查阅

-XX:+UseSerialGC : Jvm运行在Client模式下的默认值,打开此开关后,使用Serial + Serial Old的收集器组合进行内存回收

-XX:+UseParNewGC : 打开此开关后,使用ParNew + Serial Old的收集器进行垃圾回收

-XX:+UseConcMarkSweepGC : 使用ParNew + CMS +  Serial Old的收集器组合进行内存回收,Serial Old作为CMS出现“C[……]

Read more

分类: Java 标签: , ,