`
文章列表
 Java并发编程之volatile关键字的理解          Java中每个线程都有自己的工作内存,类比于处理器的缓存,线程的工作内存中保存了被该线程使用到的变量的主内存的拷贝。线程读写变量都是直接在自己的工作内存中进行的,而何时刷新数据(指将修改的结果更新到主存或者把主存的变量读取覆盖掉工作内存中的值)是不确定的。          volatile关键字是修饰字段的关键字,貌似是JDK1.5之后才有的,在多线程编程中,很大的几率会用到这个关键字,volatile修饰变量后该变量有这么一种效果:线程每一次读该变量都是直接从主存(JVM的主存)中读,而不是从线程的工作内存中;每一 ...
Java 实现基于Redis的分布式可重入锁 之前在 Java实现基于的Redis的分布式锁 这篇文章中,已经实现了加锁的逻辑,但是有个缺点,就是不可重入,任何重入锁的尝试都会导致死锁的发生,想了一下,这个问题可以解决。     Thinking   如何实现可重入?   首先锁信息(指redis中lockKey关联的value值) 必须得设计的能负载更多信息,之前non-reentrant时value直接就是一个超时时间,但是要实现可重入单超时时间是不够的,必须要标识锁是被谁持有的,也就是说要标识分布式环境中的线程,还要记录锁被入了多少次。     如何在分布式线程中标 ...
Java实现基于Redis的分布式锁  单JVM内同步好办, 直接用JDK提供的锁就可以了,但是跨进程同步靠这个肯定是不可能的,这种情况下肯定要借助第三方,我这里实现用Redis,当然还有很多其他的实现方式。其实基于Redis实现的原理还算比较简单的,在看代码之前建议大家先去这里看看原理,我就不翻译了,免得变味了,看懂了之后看代码应该就容易理解了。   时间统一问题:各个客户端加锁时需要获取时间,而这个时间都不应当从本地获取,因为各个客户端的时间并不是一致的,因此需要提供一个TimeServer提供获取时间的服务,下面源码中用到的关于时间服务的三个类(包括TimeServer、Time ...
Java并发编程之异步Future机制的原理和实现           项目中经常有些任务需要异步(提交到线程池中)去执行,而主线程往往需要知道异步执行产生的结果,这时我们要怎么做呢?用runnable是无法实现的,我们需要用callable看下面的代码: import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Execu ...
  一、redis.conf 配置项说明如下: 1. daemonize no Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程   2. pidfile /var/run/redis_6379.pid 当Redis以守护进程方式运行时,即使该项没有配置,Redis也会默认把pid写入/var/run/redis.pid文件;而当Redis不是以守护进程凡是运行时,若该项没有配置,则redis不会创建pid文件。创建pid文件是尝试性的动作,即使创建写入失败,redis依然可以启动运行   3.port 6379 指定Redis监听端口, ...
JVM监控功能工具jstat的使用   格式 jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ]   GeneralOption -help:显示帮助信息 -version:显示版本 -options:显示所有的statOption   如果指定了generalOption, 那么就不能再指定outputOption ...
MySQL 错误码   0101 属于其他进程的专用标志。 0102 标志已经设置,无法关闭。0103 无法再次设置该标志。0104 中断时无法请求专用标志。0105 此标志先前的所有权已终止。0106 请将软盘插入驱动器 %1。0107 后续软盘尚未插入,程 ...
Oracle 错误码   ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-00020: 超出最大进程数 () ORA-00021: 会话附属于其它某些进程;无法转换会话 ORA-00022: 无效的会话 ID;访问被拒绝 ORA-00023: 会话引用进程私用内存;无法分离会话 ORA-00024: 单一进程模式下不允许从多个进程注册 ORA-00025: 无法分配 ORA-00026: 丢失或无效的会话 ID ORA-00027: 无法删去当前会话 ORA ...
wireshark抓取本机报文   开发时一般都拿自己的机子做客户端和服务器,此时用wireshark默认是抓取不到本机的流量的,wireshark只能抓取经过网卡的流量,不包括localhost等本地回环地址,所以想抓本地包需要用实际网卡的ip地址,具体方法:   1.管理员运行cmd   2.执行下面命令 route add 本机ip mask 255.255.255.255 网关ip  本地ip和网关ip用ipconfig查看   3.在客户端程序处将localhost或者127.0.0.1改成实际的ip地址   4.使用wireshark即可抓取到本地包了 ...
DB2 错误码大全  SQLCode  SQLState  Description 000 00000 SQL语句成功完成   01xxx SQL语句成功完成,但是有警告 +012 01545 未限定的列名被解释为一个有相互关系的引用 +098 01568 动态SQL语句用分号结束 +100 02000 没有找到满足SQL语句的行 +110 01561 用DATA CAPTURE定义的表的更新 ...
MySQL LOAD DATA INFILE LOAD DATA INFILE语句是MySQL中用来批量、快速导入数据的一种方式,和SELECT ... INTO OUTFILE 作用是相反的   一、完整语法 LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name' [REPLACE | IGNORE] INTO TABLE tbl_name [PARTITION (partition_name,...)] [CHARACTER SET charset_name] ...
Linux 注册系统服务   像mysql,ssh这些我们都可以用service mysqld start类似的命令来启动、关闭等,那我们如何把我们自己的程序也按照如此的方式来进行管理呢?   1.进入/etc/init.d, 建立文件 xxxd,其内容形如以下: #!/bin/bash # chkconfig: - 90 10 # description: test service # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . ...
MySQL-5.7 安装   一、Windows    安装准备:下载压缩包(官网)解压后,进入bin目录 1.在当前目录下执行 mysqld -install [serviceName],serviceName为服务名,默认为MySQL 2.执行mysqld --initialize, 会执行一段时间,耐心等待,执行完后在mysql解压跟目录下会多出个data文件夹 3.data文件夹下有个.errr文件,里面有随机生成的root用户密码:  4.登陆:mysql -uroot -p,然后粘贴密码就行 5.修改密码:ALTER USER 'root'@'localhost ...
Linux Shell运算符   Shell中的运算符可分为算数运算符、关系运算符、布尔运算符、字符串运算符和文件测试运算符   1.算术运算符   a=2, b=1 Operator Description Example + 加法 `expr $a + $b` # 3 - 减法 `expr $a - $b` # 1 * 乘法 `expr $a \* $b` # 2, *需转义 / 除法 `expr $a / $b' # 2 % 取余 `expr $a % $b' # 0 = 赋值 name=value ...
设置环境变量   一、 直接在shell执行export   设置完后只对当前终端有效, 其他终端获取不到该变量       二、 编辑用户主目录下的.bash_profile文件, 这个文件定义的变量只对当前用户有效   在末尾处添加     保存后在当前shell依然获取不到, 需要让修改生效, 执行   执行完后在当前shell能获取到新设置的变量, 但在别的shell依然获取不到, 需要在别的shell在执行一边source命令才行, 最好的办法就是注销再登录或者重启,        三、编辑/etc/profile文件, 这个文件定义的变量对所有 ...
Global site tag (gtag.js) - Google Analytics