分类目录归档:技术栈

在32位的机器上对long型变量进行加减操作并发隐患


常听人说,在32位的机器上对long型变量进行加减操作存在并发隐患,到底是不是这样呢?

非volatile类型的long和double型变量是8字节64位的,32位机器读或写这个变量时得把人家咔嚓分成两个32位操作,可能一个线程读了某个值的高32位,低32位已经被另一个线程改了。所以官方推荐最好把long\double 变量声明为volatile或是同步加锁synchronize以避免并发问题。

https://docs.oracle.com/javase/specs/jls/se8/html/jls-17.html#jls-17.7

Read more

Java序列化


RMI中对数据对象的序列化采用的是Java序列化。而目前主流的微服务框架却几乎没有用到Java序列化,SpringCloud用的是Json序列化,Dubbo虽然兼容了Java序列化,但默认使用的是Hessian序列化。

Java序列化的缺陷

1.无法跨语言

2.易被攻击

攻击者可以创建循环对象链,然后将序列化后的对象传输到程序中反序列化,这种情况会导致hashCode方法被调用次数呈次方爆发式增长, 从而引发栈溢出异常。例如下面这个案例就可以很好地说明。

Set root = new HashSet();
Set s1 = root;
Set s2 = new HashSet();
for (

Read more

HashMap


链表长度大于8而且整个map中的键值对大于等于MIN_TREEIFY_CAPACITY (64)才进行链表到红黑树的转换


//-----------------------------------------------
final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
                   boolean evict) {
        Node<K,V>[] tab; Node<K,V> p; int n, i;
        if ((tab = table) 

Read more

如何制定调优策略


如何预热?

可以通过设置CompileThreshold参数降低执行方法次数阈值来提前预热代码,也可以通过调用WarmUpContextListener.invoke方法指定需要预热的方法,当然也可以在启动时提前写个循环或多线程调用该方法。

我们还可以使用一些工具来预热,例如之前有同学提到的JMH。

Read more