摘要:
双重检查锁定(Double Check Lock,DCL) 1、懒汉式单例模式,无法保证线程安全: 2、同步处理,synchronized就会导致这个方法比较低效: 3、双重检查 DCL: 但是,仍然有问题!! 创建对象过程: (1)分配内存空间 (2)初始化对象 (3)将内存空间的地址赋值给对应的 阅读全文
摘要:
happens-before 一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在happens-before关系 happen-before原则是JMM中非常重要的原则,它是判断数据是否存在竞争、线程是否安全的主要依据,保证了多线程环境下的可见性。 happens-before原则定 阅读全文
摘要:
在执行程序时为了提高性能,提高并行度,编译器和处理器常常会对指令做重排序。重排序分三种类型: 问题:重排序都可能会导致多线程程序出现内存可见性问题 1)编译器优化的重排序。编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。 2)指令级并行的重排序。处理器多条指令重叠执行,改变语句对应 阅读全文
摘要:
synchronized是一个重量级的锁,volatile通常被比喻成轻量级的synchronized volatile是一个变量修饰符,只能用来修饰变量。 volatile写:当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量刷新到主内存。 volatile读:当读一个vo 阅读全文
摘要:
一、synchronized用法 Java中的同步块用synchronized标记。 同步块在Java中是同步在某个对象上(监视器对象)。 所有同步在一个对象上的同步块在同时只能被一个线程进入并执行操作。 所有其他等待进入该同步块的线程将被阻塞,直到执行该同步块中的线程退出。 (注:不要使用全局对象 阅读全文
摘要:
一、进程 线程 进程:一个进程来对应一个程序, 每个进程对应一定的内存地址空间,并且只能使用它自己的内存空间,各个进程间互不干扰。 进程保存了程序每个时刻的运行状态,这样就为进程切换提供了可能。当进程暂停时,它会保存当前进程的状态(比如进程标识、进程的使用的资源等),在下一次重新切换回来时,便根据之 阅读全文
摘要:
1、学习jdk源码,从以下几个方面入手: 类定义(继承,实现接口等) 全局变量 方法 内部类 2、hashCode 为什么是31? (1)计算hashcode值一般选质数 (2)太小的数计算的hashcode值冲突率高,太大的数乘法计算会溢出int范围 (3)有以上两点和实验得 出:31, 33, 阅读全文
摘要:
Java内存模型 JMM 重排序 happens-before 顺序一致性内存模型 volatile 锁 阅读全文
摘要:
top ps jps jstack jmap java服务器问题排查 JVM命令 阅读全文
摘要:
记录日常工作中一些容易被忽视的错误及细节,持续更新...... 一、问题:HashMap<Long, String>中,用get(Integer key)取不到值 1.首先想到Long与Integer的hashCode方法不同,Integer-value Long-(int)(value ^ (va 阅读全文