ConcurrentHashMap使用要点
摘要:ConcurrentHashMap的简要总结:
1、public V get(Object key)不涉及到锁,也就是说获得对象时没有使用锁;
2、put、remove方法要使用锁,但并不一定有锁争用,原因在于ConcurrentHashMap将缓存的变量分到多个Segment,每个Segment上有一个锁,只要多个线程访问的不是一个Segment就没有锁争用,就没有堵塞,各线程用各自的锁,ConcurrentHashMap缺省情况下生成16个Segment,也就是允许16个线程并发的更新而尽量没有锁争用;
阅读全文
posted @
2015-09-02 23:11
上校
阅读(52548)
推荐(5) 编辑
memcached完全剖析–1. memcached的基础
摘要:系列文章导航:
memcached完全剖析–1. memcached的基础
memcached全面剖析–2. 理解memcached的内存存储
memcached全面剖析–3. memcached的删除机制和发展方向
memcached全面剖析–4. memcached的分布式算法
memcached全面剖析–5. memcached的应用和兼容程序
阅读全文
posted @
2015-08-28 23:11
上校
阅读(362)
推荐(0) 编辑
迭代中删除元素
摘要:1.for迭代中删除元素会报错 java.util.ConcurrentModificationException
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
for (String str : list) {
if (str.equals("c")) {
list.remove(str);
}
}
System.out.println(list);
阅读全文
posted @
2015-08-24 14:46
上校
阅读(1301)
推荐(0) 编辑
java中使用正则表达式
摘要:1.用正则表达式分割字符串
Pattern SPLIT2 = Pattern.compile("[,]");
String[] tmpStrings1 = SPLIT2.split(string);
阅读全文
posted @
2015-06-07 20:45
上校
阅读(301)
推荐(0) 编辑
Timer与ScheduledThreadPoolExecutor的比较
摘要:推荐还是用第一种方法,即用timer并且在timer里面使用线程池。
1.timer中用线程池来执行任务,可以保证开始执行时间的准确,具体结束时间要以任务需要执行时间为准。如果未使用线程池,执行时间将被任务执行时间所影响。
package timer;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
阅读全文
posted @
2015-06-07 00:05
上校
阅读(1263)
推荐(0) 编辑
Java同步块
摘要:原文:http://ifeve.com/synchronized-blocks/
Java 同步块(synchronized block)用来标记方法或者代码块是同步的。Java同步块用来避免竞争。本文介绍以下内容:
Java同步关键字(synchronzied)
实例方法同步
静态方法同步
实例方法中同步块
静态方法中同步块
Java同步示例
阅读全文
posted @
2015-06-01 10:48
上校
阅读(1716)
推荐(0) 编辑
java中的浅拷贝与深拷贝
摘要:浅拷贝:
package test;
class Student implements Cloneable {
private int number;
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
阅读全文
posted @
2015-05-31 21:38
上校
阅读(1539)
推荐(0) 编辑
java的关闭钩子(Shutdown Hook)
摘要:Runtime.getRuntime().addShutdownHook(shutdownHook);
这个方法的含义说明:
这个方法的意思就是在jvm中增加一个关闭的钩子,当jvm关闭的时候,会执行系统中已经设置的所有通过方法addShutdownHook添加的钩子,当系统执行完这些钩子后,jvm才会关闭。所以这些钩子可以在jvm关闭的时候进行内存清理、对象销毁等操作。
阅读全文
posted @
2015-05-22 23:53
上校
阅读(5924)
推荐(0) 编辑
JVM系列三:JVM参数设置、分析
摘要:原文:http://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html
不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选择不同的GC策略,调整JVM、GC的参数,可以极大的减少由于GC工作,而导致的程序运行中断方面的问题,进而适当的提高Java程序的工作效率。但是调整GC是以个极为复杂的过程,由于各个程序具备不同的特点,如:web和GUI程序就有很大区别(Web可以适当的停顿,但GUI停顿是客户无法接受的),而且由于跑在各个机器上的配置不同(主要cup个数,内存不同),所以使用的GC种类也会不同(如何选择见GC种类及如何选择)。本文将注重介绍JVM、GC的一些重要参数的设置来提高系统的性能。
阅读全文
posted @
2015-03-13 00:16
上校
阅读(1606)
推荐(0) 编辑
java虚拟机参数设置
摘要:-Xms8000M 初始化的堆大小
-Xmx8000M 堆的最大值
-XX:+HeapDumpOnOutOfMemoryError 堆溢出时Dump出当前内存堆转储快照以便事后分析
-XX:PermSize=10M 方法区(非堆)初始化大小
-XX:MaxPermSize=10M 方法区(非堆)最大值
-Xss2M 栈大小
阅读全文
posted @
2015-03-07 22:26
上校
阅读(643)
推荐(0) 编辑
UTF-8编码规则(转)
摘要:UTF-8是Unicode的一种实现方式,也就是它的字节结构有特殊要求,所以我们说一个汉字的范围是0X4E00到0x9FA5,是指unicode值,至于放在utf-8的编码里去就是由三个字节来组织,所以可以看出unicode是给出一个字符的范围,定义了这个字是码值是多少,至于具体的实现方式可以有多种多样来实现。
UTF-8是一种变长字节编码方式。对于某一个字符的UTF-8编码,如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的位数,其余各字节均以10开头。UTF-8最多可用到6个字节。
如表:
阅读全文
posted @
2015-01-12 01:13
上校
阅读(1089)
推荐(0) 编辑
过滤3个字节以上的utf-8字符
摘要:/**
* 过滤掉超过3个字节的UTF8字符
* @param text
* @return
* @throws UnsupportedEncodingException
*/
public static String filterOffUtf8Mb4(String text) throws UnsupportedEncodingException {
byte[] bytes = text.getBytes("utf-8");
ByteBuffer buffer = ByteBuffer.allocate(bytes.length);
int i = 0;
阅读全文
posted @
2015-01-11 23:30
上校
阅读(3212)
推荐(1) 编辑
通过位运算生成ID
摘要:public static void main(String[] args) {
long serverId = 65535;
System.out.println("ServerId:" + serverId);
long a1 = 0b11110001001000000;// 123456
// 11110001001000000
// 0000000000000000
System.out.println("顺序号,a1:" + a1);
long a2 = a1 16;
System.out.println("左移16位,a2:" + a2);
阅读全文
posted @
2015-01-10 21:05
上校
阅读(413)
推荐(0) 编辑
Netty系列之Netty百万级推送服务设计要点
摘要:原文:http://www.infoq.com/cn/articles/netty-million-level-push-service-design-points
1. 背景
1.1. 话题来源
最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题。问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为如下几类:
Netty是否可以做推送服务器?
如果使用Netty开发推送服务,一个服务器最多可以支撑多少个客户端?
使用Netty开发推送服务遇到的各种技术问题。
由于咨询者众多,关注点也比较集中,我希望通过本文的案例分析和对推送服务设计要点的总结,帮助大家在实际工作中少走弯路。
阅读全文
posted @
2015-01-05 19:13
上校
阅读(15065)
推荐(11) 编辑
ANT教程经典
摘要:Ant是一个Apache基金会下的跨平台的构件工具,它可以实现项目的自动构建和部署等功能。在本文中,主要让读者熟悉怎样将Ant应用到Java项目中,让它简化构建和部署操作。
一. 安装与配置
下载地址:http://ant.apache.org/,在本文中下载的是1.7.0版本。解压到某个目录(例如E:"apache-ant-1.7.0),即可使用。
添加系统环境变量:ANT_HOME,该变量指向Ant解压后的根目录,在此为E:"apache-ant-1.7.0。
安装与配置完毕后,读者可以测试一下Ant是否可用,首先进入Ant的bin目录,运行命令ant –version,若安装和配置成功,则会显示Ant版本信息,如下图所示:
阅读全文
posted @
2015-01-02 22:57
上校
阅读(311)
推荐(0) 编辑
volatile适用场景
摘要:1.volatile最适用一个线程写,多个线程读的场合。
如果有多个线程并发写操作,仍然需要使用锁或者线程安全的容器或者原子变量来代替。(摘自Netty权威指南)
疑问:如果只是赋值的原子操作,是否可以多个线程写?
阅读全文
posted @
2015-01-01 21:28
上校
阅读(7768)
推荐(0) 编辑
Java并发编程:volatile关键字解析
摘要:Java并发编程:volatile关键字解析
volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。
volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识,然后分析了volatile关键字的实现原理,最后给出了几个使用volatile关键字的场景。
阅读全文
posted @
2015-01-01 15:13
上校
阅读(495)
推荐(0) 编辑
JAVA CAS原理深度分析
摘要:CAS
CAS:Compare and Swap, 翻译成比较并交换。
java.util.concurrent包中借助CAS实现了区别于synchronouse同步锁的一种乐观锁。
本文先从CAS的应用说起,再深入原理解析。
阅读全文
posted @
2015-01-01 00:43
上校
阅读(8882)
推荐(2) 编辑
map遍历测试结果
摘要:结论:一般情况下推荐使用enterSet的for循环(即以下的方法2),如果只是取key值可以使用keySet性能会更好。
因为keySet只取key,enterSet即取了key又取了value。
public static void main(String[] args) throws Exception {
ConcurrentHashMap r = new ConcurrentHashMap();
long size = 2000000;
// 方法1
for (long i = 0; i size; i++) {
r.put(i, new ReqPacket());
}
System.out.println("方法1开始执行数:" + r.size());
阅读全文
posted @
2014-12-31 11:10
上校
阅读(883)
推荐(0) 编辑