java
江无水
这个作者很懒,什么都没留下…
展开
-
线程唤醒的两种方式
通过 LockSupport.park(); 阻塞的线程,可以通过下面两种方式唤醒:通过 LockSupport.unpark(thread) 唤醒使用中断 thread.interrupt() 唤醒public static void main(String[] args) { Thread t0 = new Thread(() -> { Thread current = Thread.currentThread(); System.out.prin原创 2021-02-22 14:55:30 · 2773 阅读 · 0 评论 -
AQS
lock的核心原理: 自旋(即循环) LockSupport(阻塞/唤醒指定线程) CAS操作(保证并发场景下只能有一个线程获取锁) 队列容器(实现公平锁或者非公平锁)。原创 2021-02-22 14:12:08 · 84 阅读 · 0 评论 -
锁的消除
private void method(){ Object object = new Object(); synchronized (object){ // //sdf //asdf System.out.println(); } }当method方法被多个线程执行,由于被锁对象object 是在方法内部声明的,即每个线程的object对象是不同的对象,原创 2021-02-20 14:23:46 · 113 阅读 · 0 评论 -
并发三大特性
并发三大特性:原子性: 原子性指的是一个操作是不可中断的,即使是在多线程环境下,一个操作一旦开始就不会被其他线程影响。可以通过 synchronized和Lock实现原子性,volatile不能保证原子性。有序性: 有序性是指对于单线程的执行代码,我们总是认为代码的执行是按顺序依次执行的,即使指令重排也要保证执行结果不受影响。可见性: 共享变量在不同线程的工作内存可见,volatile可以解决可见性问题(能否及时可见),不加volatile也可能可见,但不一定及时。synchronize原创 2021-02-19 15:33:53 · 668 阅读 · 0 评论 -
JMM内存模型
JMM(Java memory module)java线程内存模型注意,JMM内存模型更多是规范上的概念,不要与JVM运行时数据区混淆。数据同步的八大原子操作: (1)lock(锁定):作用于主内存的变量,把一个变量标记为一条线程独占状态 (2)unlock(解锁):作用于主内存的变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定 (3)read(读取):作用于主内存的变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作使用 (4)load原创 2021-02-19 13:51:54 · 133 阅读 · 0 评论 -
空间局部性
cpu读取数据如果一个存储器的位置被引用,那么将来他附近的位置也会被引用。public class TwoDimensionalArraySum { private static final int RUNS = 10; private static final int DIMENSION_1 = 1024 * 1024; private static final int DIMENSION_2 = 6; private static long[][] longs;原创 2021-02-19 10:57:07 · 213 阅读 · 0 评论 -
JVM垃圾回收
垃圾收集算法复制算法标记整理算法标记清除算法分代收集理论:根据年轻代和老年代的内存特点采用不同的收集算法垃圾收集器Serial串行收集器(年轻代和老年代都可以用,现在几乎不用) -XX:+UseSerialGC -XX:+UseSerialOldGC 年轻代采用复制算法,老年代采用标记整理算法 STW的时候单线程收集Parallel并行收集器(年轻代和老年代都可以用) -XX:+UseParallelGC -XX:+UseParallelOldGC 可以原创 2021-02-18 17:20:11 · 92 阅读 · 0 评论 -
常量池
常量池中主要存两种数据:字面量和符号引用。javap -v 指令查看的是静态常量池,运行时加载到方法区称为运行时常量池。字符串常量池 1.6及以前,字符串常量池在运行时常量池内,从1.7之后字符串常量池移至堆区。 创建字符串常量时,首先查询字符串常量池是否存在该字符串,存在该字符串,返回引用实例,不存在,实例化该字符串并放入池中字符串三种操作:直接赋值字符串 先去常量池中通过 equals(key) 方法,判断是否有相同的对象 如果有,则直接返回该对象在常量池中的引用; 如果没原创 2021-02-18 17:16:59 · 195 阅读 · 0 评论 -
GC调优
JAVA常用指令: java/jdk/bin目录下自带一些工具 jps:查看当前运行的java程序进程ID jmap:查看内存信息、实例个数以及占用内存大小 jmap -histo pid jmap -heap pid 查看堆信息 jmap ‐dump:format=b,file=eureka.hprof pid查看dump快照 使用jvisualvm jstack pid可以查看线程状态,可以直接显示死锁; top -p pid显示进程的内存情况...原创 2021-02-18 15:28:59 · 127 阅读 · 0 评论 -
Java字节码「随身手册」
Java字节码手册转载 2021-02-07 16:44:59 · 152 阅读 · 0 评论 -
JVM
JVM主要由三块组成:类加载子系统运行时数据区字节码执行引擎一、类加载子系统参考 类加载机制二、运行时数据区1.程序计数器跟随线程,记录当前线程指令执行位置唯一不会发生OOM的区域2.虚拟机栈(默认1M)跟随线程,调用方法一个一个栈帧入栈(注意OOM和StackOverflowError的区别)栈帧入栈出栈也可看出来局部变量的有效区域每个栈帧包括:本地变量表:方法内的变量操作数栈(栈结构):操作数据的临时存放区动态链接:符号引用转直接引用方法出口:方法结束回到调用方的指原创 2021-02-07 16:08:27 · 83 阅读 · 0 评论 -
JVM类加载机制
一、内置类加载器1.跟加载器(c++代码的一段加载逻辑)2.扩展类加载器 Launcher.ExtClassLoader3.应用类加载器 Launcher.AppClassLoader三个内置加载器是逻辑上的父子关系,并非Java语法上的继承关系,具体详见sun.misc.Launcher构造方法,ExtClassLoader实例通过传参设置为AppClassLoader的parent属性。二、双亲委派双亲委派的具体过程为,自下而上检查是否加载过某类,有则直接返回,没有则委派给父加载器(详见ja原创 2021-02-05 14:21:33 · 112 阅读 · 0 评论