关于synchronized用法的简单理解

2017年5月14日 没有评论

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 标签: , ,

Java GC之常见垃圾收集器

2017年2月26日 没有评论

上一篇文章简单写了JVM的常见垃圾回收算法,今天就让我们看看根据这些算法有哪些常见的垃圾收集器,他们有什么特点,然后根据自己的应用特点和要求组合出各个年代所使用的收集器。

gccollect

上图展示了JDK1.7Update14之后的HotSpot虚拟机的7种作用于不同分代的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用。虚拟机所处的区域,则表示它是属于新生代收集器还是老年代收集器

1. Serial收集器

Serial收集器是最基本、发展历史最悠久的收集器,在JDK 1.3.1之前是虚拟机新生代收集的唯一选择。见名知意它是一个单线程的收集器,“单线程”的意义并不仅仅说明它[……]

Read more

分类: Java 标签: , ,

Java GC之垃圾回收算法

2017年2月19日 没有评论

上一篇文章简单写了一下JVM如何判断一个对象是否已经死了,当判断出一个对象已经死了之后,接下来就要进行垃圾回收了,所以在进行垃圾回收之前,先让我们看看垃圾回收的算法有哪些。

1. 标记-清除算法

标记清除见名知意该算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成之后统一回收所有被标记的对象,至于如何标记就是上一篇文章中所讲的方法了。这种算法比较简单,容易理解,同时也是一个最基础的垃圾回收算法,后面所讲的算法都是对他的改进,至于为什么需要改进,因为他主要存在两个不足:

①. 效率问题,标记和清除两个阶段的效率都不高;
②. 空间问题,标记清除之后会[……]

Read more

分类: Java 标签: ,

Java GC之对象已死吗

2017年2月11日 没有评论

差不多两年以前曾经写过一篇文章:JAVA 性能调优,其实在那篇文章中只是简单的说了,对象的分布。这篇文章继续对分布于堆中的对象的生命周期进行说明,也就是确定堆中的这些对象哪些还是“活着”的,哪些是已经“死去”(即不可能再被任何途径使用的对象)的。

1. 引用计数算法

有很多人认为判断对象是否活着的算法是这样的:给对象添加一个引用计数器,每当有一个地方引用他的时候,计数器就加1,引用失效的时候,计数器减1,当计数器的数值为0时就是不可能在被引用的对象,此时就就可以认为是已死的对象。引用计数器算法实现简单,效率也很高,是一个不错的算法,但是主流的Java虚拟机并没有采用这种算法来管理内[……]

Read more

分类: Java 标签: ,

Redis实现分布式锁

2017年1月15日 没有评论

大家都知道Redis是NoSQL的一种,目前在互联网公司中在作为缓存广泛的使用者,其实利用Redis的setnx还可以快速实现一个分布式锁,公司的业务就需要使用分布式锁保证数据的唯一性,经检索在网上发现已经有活雷锋分享了一套,本着不在重新发明轮子的想法,测试了一下好像没有问题,几乎不用对原代码进行修改,就能使用,下面就分享在这里,供需要的朋友参考。原文里面还有对实现的原理进行解释,所以本文就不再赘述,详情请通过参考资料进行访问。


package cn.bridgeli.distributedlock;

import java.util.UUID;
import java.[......]

Read more

分类: Redis 标签: ,

Spring aop应用之实现数据库读写分离

2016年12月31日 没有评论

去年五月份的时候曾经写过一篇:Spring加Mybatis实现MySQL数据库主从读写分离,实现的原理是配置了多套数据源,相应的sqlsessionfactory,transactionmanager和事务代理各配置了一套,如果从库或数据库有多个的时候,需要配置的信息会越来越多,远远不够优雅,在我们编程界有一个规范:约定优于配置。所以就用Sping的aop实现了一个简单的数据库分离方案,具体实现代码放在了Github上,地址如下:


https://github.com/bridgeli/practical-util/tree/master/src/main/java/cn/brid[......]

Read more

分类: Java 标签: , , ,