- 博客(104)
- 收藏
- 关注

原创 Java 可重入自旋锁简单实现
自旋锁特点:1. 轻量级操作,无需挂起线程2. 特别吃CPU,如果线程在临界区的操作比较耗时或者线程对临界区的竞争很激烈,那还是老老实实用普通的锁以下是Java的简单实现public class SpinLock implements Lock { /** * 锁持有线程, null表示锁未被任何线程持有 */ private final AtomicRefe...
2018-05-15 16:04:09
2344

原创 Javassist实现动态代理
Javassist实现动态代理 动态代理模式简述:之所以会出现代理这种模式就是因为我们常有这么一种需求:在被代理类的方法调用前后执行一些其它的逻辑,这些逻辑不适合由被代理类来实现,那这些逻辑谁来实现?当然是代理类。那代理类是谁?从哪里来?代理类是我们利用字节码生成工具动态创建的,然后利用反射实例化而得到代理对象。 tips:这篇文章讲的不是动态代理模式的思想而是怎么
2017-09-11 14:29:45
602

原创 Java 实现基于Redis的分布式可重入锁
Java 实现基于Redis的分布式可重入锁之前在 Java实现基于的Redis的分布式锁 这篇文章中,已经实现了加锁的逻辑,但是有个缺点,就是不可重入,任何重入锁的尝试都会导致死锁的发生,想了一下,这个问题可以解决。 Thinking 如何实现可重入? 首先锁信息(指redis中lockKey关联的value值) 必须得设计的能负
2016-09-28 21:48:52
5792
1

原创 Java实现基于Redis的分布式锁
Java实现基于Redis的分布式锁 单JVM内同步好办, 直接用JDK提供的锁就可以了,但是跨进程同步靠这个肯定是不可能的,这种情况下肯定要借助第三方,我这里实现用Redis,当然还有很多其他的实现方式。其实基于Redis实现的原理还算比较简单的,在看代码之前建议大家先去这里看看原理,我就不翻译了,免得变味了,看懂了之后看代码应该就容易理解了。 时间统一问题:各个客户端加
2016-09-27 15:23:39
876

原创 Linux下用expect实现ssh自动登录并执行脚本
Linux下用expect实现ssh自动登录并执行脚本 expect不是系统自带的,需要安装: yum install expect装完后才可执行以下脚本。 ssh密码认证的登陆脚本:Shell代码 #!/bin/bash # 匹配提示符 CMD_PROMPT="\](\$|#)"
2016-09-27 15:19:18
11941
1

原创 Linux SSH公钥认证配置
Linux SSH公钥认证配置 ssh支持两种认证方式:密码认证和公钥认证。若没有配置公钥认证,则每次ssh连接时都需要输入密码,不仅麻烦而且还不安全,因此推荐配置公钥认证,只需在配置时输入一次密码,之后ssh连接就无需输入密码了。 公钥认证配置只需在ssh客户端机子上配就可以: 1.在客户端机子上生成公钥id_rsa.pub和私钥id_rsa(默认存在当前用户主目录的.s
2016-09-27 15:16:42
5228

原创 WebSocket 协议
WebSocket 协议WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通信(full-duplex)。在这之前都是客户端主动请求服务端,一请求一应答,很多时候实现消息更新都是采用ajax轮询,有延迟,有了WebSocket双方都可以主动发给对端,实现真正的推送。 一、WebSocket Protocol Format(协议格式
2016-09-27 15:11:54
9632
1

原创 Redis及其Sentinel配置项详细说明
一、redis.conf 配置项说明如下:1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 daemonize no2. 当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定 pidfile /var/run/redis.pid3. 指定Redis
2016-08-27 14:29:38
34692
9

原创 Java并发编程之异步Future机制的原理和实现
Java并发编程之异步Future机制的原理和实现 项目中经常有些任务需要异步(提交到线程池中)去执行,而主线程往往需要知道异步执行产生的结果,这时我们要怎么做呢?用runnable是无法实现的,我们需要用callable看下面的代码:Java代码 import java.util.concurrent.Callable; impo
2016-08-27 14:27:32
13009
4

原创 Java并发编程之CyclicBarrier的使用
Java并发编程之CyclicBarrier的使用 先看javadoc对这个类的说明:A synchronization aid that allows a set of threads to all wait for each other to reach a common barrier point. CyclicBarriers are useful in programs
2016-08-27 14:25:10
673

原创 Java并发编程之volatile关键字的理解
Java并发编程之volatile关键字的理解 Java中每个线程都有自己的工作内存,类比于处理器的缓存,线程的工作内存中保存了被该线程使用到的变量的主内存的拷贝。线程读写变量都是直接在自己的工作内存中进行的,而何时刷新数据(指将修改的结果更新到主存或者把主存的变量读取覆盖掉工作内存中的值)是不确定的。 volatile关键字是修饰字段的关键字
2016-08-27 14:23:11
1054
原创 JVM 栈帧
JVM 栈帧 一、栈帧 栈帧(Frame)是用来存储数据和部分过程结果的数据结构,同时也被用来处理动态链接(Dynamic Linking)、方法返回值和异常分派(Dispatch Exception)。 栈帧随着方法调用而创建,随着方法结束而销毁——无论方法是正常完成还是异常完成(抛出了在方法内未被捕获的异常)都算作方法结束。栈帧的存储空间分配在Java虚
2017-09-12 20:08:06
573
原创 Linux wc命令
Linux wc命令 作用:统计字节数、字符数、行数、最长的行的长度、单词数 格式:wc [OPTION]... [FILE]...wc [OPTION]... --files0-from=F OPTION:-c,或--bytes : 计算字节数 -m,或--chars : 计算字符数
2017-09-12 20:07:54
614
原创 ZooKeeper 伪集群安装
ZooKeeper 伪集群安装伪集群即在一台机子上装多个zookeeper,学习测试用.... zookeeper集群至少需要3台,两台是不可以的,因为只有不少于法定仲裁(2/3)的服务器数量正常运行时,整个集群才提供服务。 1.下载 zookeeper-3.4.9.tar.gz 2.解压,并复制出三份出来,分别放在zookeepe
2017-09-12 20:07:40
355
原创 MySQL 时间日期类型和相关函数
MySQL 时间日期类型和相关函数 一、时间日期类型MySQL中的日期和时间类型类型字节最小值最大值零值DATETIME81000-01-01 00:00:009999-12-31 23:59:590000-00-00 00:00:00DATE41000-01-019999-12-31000
2017-09-12 20:07:29
750
原创 JVM 垃圾收集器
JVM 垃圾收集器 基本概念 Young Generation:新生代,hotspot vm中又细分为Eden和两个Survivor(from survivor和to survivor)Tenured Generation:老年代Minor GC:只GCyoung generation。Full GC、Major GC:一个意思,指GC整个heap,包括young
2017-09-12 20:07:02
455
原创 JVM GC算法
VM GC算法基础概念 GC Roots: The objects that a program can access directly are those objects which are referenced by local variables on the processor stack as well as by any static variables
2017-09-12 20:06:29
427
原创 MySQL 日志
MySQL 日志概述MySQL日志记录了MySQL服务器的各种行为,MySQL中日志有如下几种:类型描述Error Log记录 MySQL启动,运行,停止过程General Query Log 记录客户端的连接以及接受的SQLBinary Log 记录改变数据的语句(通常用于复制)Relay Log记录
2017-09-11 15:29:28
351
原创 WebSocket 协议
WebSocket 协议WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通信(full-duplex)。在这之前都是客户端主动请求服务端,一请求一应答,很多时候实现消息更新都是采用ajax轮询,有延迟,有了WebSocket双方都可以主动发给对端,实现真正的推送。 一、WebSocket Protocol Format(协议格式
2017-09-11 15:25:35
428
原创 简单组合java.util.Map<K,V>实现Map<K,P,V>
简单组合java.util.Map实现Map java.util.Map为单键对单值,有时需要双键对单值,因此基于Map可以简单实现一个Map。 接口定义:Java代码 package cc.lixiaohui.demo.javassist.proxy.util; import java.util.Collection;
2017-09-11 15:23:59
499
原创 MySQL 主从复制
MySQL 主从复制环境:win10(就配置主从来说linux和windows差别不大),MySQL-5.7.16 1.首先要两个MySQL实例,我这里分别是3307,3308,其中3307作为master,3308作为slave 2.修改master实例的配置my.ini,增加两行:Ini代码 [mysqld] log_b
2017-09-11 15:22:48
268
原创 Java并发编程之线程池任务监控
Java并发编程之线程池任务监控 当我们提交runnable或者callable到ThreadPoolExecutor时,我们是无法知道这些任务是在什么时候才真正的执行的,为了实现这个需求,我们需要扩展ThreadPoolExecutor,重写beforeExecute和afterExecute,在这两个方法里分别做一些任务执行前和任务执行后的相关监控逻辑,还有个terminate
2017-09-11 14:27:48
2769
原创 MySQL MyISAM与表锁
MySQL MyISAM与表锁 在数据库中,除了CPU、内存、IO等的争用外,数据也是一种供许多用户共享的资源,如何保证数据并发的一致性、有效性是所有数据库必须解决的问题,锁冲突也是影响数据库并发性能的一个重要因素。MySQL中不同的存储引擎之间的锁机制不一定相同,例如MyISAM和MEMORY采用的是表锁,BDB采用的是页面锁,但野支持表锁,InnoDB默认是行锁,但也支持表锁。
2017-09-08 14:21:18
634
原创 MySQL XA事务
MySQL XA事务 MySQL从5.0.3开始支持分布式事务,当前的分布式事务只支持InnoDB存储引擎,在MySQL中,使用分布式事务的应用程序涉及一个或多个资源管理器和一个事务管理器。 资源管理器(Resource Manager):用于提供通向事务资源的途径,数据库服务器是一种资源管理器。该资源必须可以提交或回滚由RM管理的事务,例如,多态MySQL数据库作
2017-09-08 14:20:23
857
原创 MySQL 分区
MySQL 分区 分区是指根据一定的规则,把一个表分解成多个更小更易管理的部分,逻辑上只有一个表或一个索引,但是实际上该表可能由数个物理分区对象组成,每个分区都是一个独立的对象,每个分区可以独自处理,也可以作为表的一部分处理。分区对应用是完全透明的。 分区的优点体现在以下方面:和单个磁盘或者文件系统相比,可以存储更多数据优化查询,在Where子句中包
2017-09-08 14:19:05
654
原创 MySQL 通信协议介绍
MySQL 通信协议介绍 1、数据类型了解MySQL协议包之前必需先知道其数据类型 1.1 Integer Types 整数类型(1)定长整型固定长度, 小端编码, 有下面几种(括号内的代表所占字节数):intintintintintint (2)变长整型可能长度为1,
2017-09-08 14:17:24
4730
原创 Maven 生命周期与插件
Maven 生命周期与插件 一、生命周期Maven有三套独立的生命周期,分别为clean,default和site。clean生命周期的目的是清理之前的构建,default的目的是构建项目,site的目的是建立项目站点。 每个生命周期都包含一些阶段(build phase),这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段。三套生命周期是完全独立的,我们可
2017-09-08 14:15:56
330
原创 Linux Shell运算符
Linux Shell运算符 Shell中的运算符可分为算数运算符、关系运算符、布尔运算符、字符串运算符和文件测试运算符 1.算术运算符 a=2, b=1OperatorDescriptionExample+加法`expr $a + $b` # 3-减法`expr $a - $b` #
2017-09-08 14:14:44
303
原创 Linux设置环境变量
设置环境变量 一、 直接在shell执行export 设置完后只对当前终端有效, 其他终端获取不到该变量 二、 编辑用户主目录下的.bash_profile文件, 这个文件定义的变量只对当前用户有效 在末尾处添加 保存后在当前shell依然获取不到, 需要让修改生效, 执行
2017-09-08 14:14:02
345
原创 Linux 注册系统服务
Linux 注册系统服务 像mysql,ssh这些我们都可以用service mysqld start类似的命令来启动、关闭等,那我们如何把我们自己的程序也按照如此的方式来进行管理呢? 1.进入/etc/init.d, 建立文件 xxxd,其内容形如以下:Shell代码 #!/bin/bash # chkconfig: - 90 1
2017-09-08 14:12:59
4568
2
原创 MySQL LOAD DATA INFILE
MySQL LOAD DATA INFILELOAD DATA INFILE语句是MySQL中用来批量、快速导入数据的一种方式,和SELECT ... INTO OUTFILE 作用是相反的 一、完整语法Sql代码 LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name'
2017-09-08 14:09:20
3913
原创 JVM监控功能工具jstat的使用
JVM监控功能工具jstat的使用 格式jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ] GeneralOption-help:显示帮助信息-version:显示版本-options:显示所有的statOption 如果指定了ge
2017-09-08 14:07:28
331
JVM监控功能工具jstat的使用
JVM监控功能工具jstat的使用 格式jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ] GeneralOption-help:显示帮助信息-version:显示版本-options:显示所有的statOption 如果指定了generalOption, 那么就不能再...
2017-08-04 11:37:48
215
MySQL 错误码
MySQL 错误码 0101 属于其他进程的专用标志。 0102 标志已经设置,无法关闭。0103 无法再次设置该标志。0104 中断时无法请求专用标志。0105 此标志先前的所有权已终止。0106 请将软盘插入驱动器 %1。0107 后续软盘尚未插入,程序停止。0108 磁盘正在使用或已由其他进程锁定。0109 管道已经结束。0110 系统无法打开指定的设备或文件。0111 文件名太长...
2017-07-12 12:31:22
2538
Oracle 错误码
Oracle 错误码 ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-00020: 超出最大进程数 () ORA-00021: 会话附属于其它某些进程;无法转换会话 ORA-00022: 无效的会话 ID;访问被拒绝 ORA-00023: 会话引用进程私用...
2017-07-12 11:42:42
346
wireshark抓取本机报文
wireshark抓取本机报文 开发时一般都拿自己的机子做客户端和服务器,此时用wireshark默认是抓取不到本机的流量的,wireshark只能抓取经过网卡的流量,不包括localhost等本地回环地址,所以想抓本地包需要用实际网卡的ip地址,具体方法: 1.管理员运行cmd 2.执行下面命令route add 本机ip mask 255.255.255.255...
2017-05-17 10:25:14
711
DB2 错误码大全
DB2 错误码大全 SQLCode SQLState Description00000000SQL语句成功完成 01xxxSQL语句成功完成,但是有警告+01201545未限定的列名被解释为一个有相互关系的引用+09801568动态...
2017-04-27 10:18:22
5605
MySQL LOAD DATA INFILE
MySQL LOAD DATA INFILELOAD DATA INFILE语句是MySQL中用来批量、快速导入数据的一种方式,和SELECT ... INTO OUTFILE 作用是相反的 一、完整语法LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name' [REPLACE | IGNORE]...
2017-04-05 13:38:35
527
Linux 注册系统服务
Linux 注册系统服务 像mysql,ssh这些我们都可以用service mysqld start类似的命令来启动、关闭等,那我们如何把我们自己的程序也按照如此的方式来进行管理呢? 1.进入/etc/init.d, 建立文件 xxxd,其内容形如以下:#!/bin/bash# chkconfig: - 90 10# description: test servic...
2017-03-14 17:29:39
163
原创 MySQL-5.7 安装
MySQL-5.7 安装 一、Windows 安装准备:下载压缩包(官网)解压后,进入bin目录1.在当前目录下执行 mysqld -install [serviceName],serviceName为服务名,默认为MySQL2.执行mysqld --initialize, 会执行一段时间,耐心等待,执行完后在mysql解压跟目录下会多出个data文件夹3.dat...
2017-03-10 17:53:15
144
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人