Code-Java
Olge
加油
展开
-
Java并发
目录概述并发在技术层面上的问题volatile&synchronized&cas概述一晃的时间,做Java开发已经有七个年头了,过去的几年多数时候其实是混混度日,没有对自己的工作和生活有太多的深入思考,当我意识到的时候,犹如晴天霹雳,这段时间思考了很多但依然没有什么头绪,我想或许应该换一种策略,找出几个有代表性的问题去深入思考一下,而技术的意义就是其中一个。而之所以再次来写Java并发,原因在于对这块知识的理解其实一直的片面的,稍微回想一些相关的知识点,好像都有.原创 2020-08-06 09:10:20 · 228 阅读 · 0 评论 -
Jvm 总结
文章目录类加载器运行时数据区自动垃圾收集机制对象的分配策略JVM 调优Java 虚拟机主要分为三个部分:类加载器、运行时数据区和执行引擎,其中类类加载器负责将类的字节码文件加载到内存中,运行时数据区存储jvm运行时产生的数据,执行引擎负责浮动程度的执行。类加载器类加载器就是我们经常说的ClassLoader,Java提供了三种类型ClassLoader,分别是BootstrapClassLo...原创 2019-11-10 17:05:07 · 106 阅读 · 0 评论 -
Java并发 总结
Java线程基础原创 2019-11-05 22:52:43 · 179 阅读 · 0 评论 -
Java并发-线程池原理
线程池是J.U.C中一个非常常用的组件,利于线程池技术可以有效利于线程资源,避免频繁的创建和销毁线程造成的系统开销,避免过多的创建线程耗尽系统资源,同时还可以更好对管理线程,包括关闭/中断以及状态监控等等。线程池原理 1. 提交任务 2. 核心线程数是否已满 3. 若核心线程数已满,则将任务加入等待队列,如果没满,则创建新的线程 4. 任务队列是否已满,如果没满则将任务...原创 2018-05-06 10:43:37 · 154 阅读 · 0 评论 -
Java-内存模型
个人理解记录jmm可以从两个方面理解: 第一个方面是jmm规范了一个抽象的内存结构,jmm对运行时内存进行简化抽象得到了主内存和本地内存两块内存区域,在线程运行时,从主内存中加载数据到本地内存,在本地内存中完成计算后,在刷新到主内存。 第二个方面是jmm可以理解为一组保证数据内存可见性和程序正确性的规则,由于这种内存模型存在很明显的数据一致性问题,再加上编译器的指令重排序和cpu乱序执行优...原创 2018-07-22 09:05:34 · 129 阅读 · 0 评论 -
Java-volatile
个人理解记录volatile可以理解为一个轻量级的synchronized,它主要用来修饰变量,用来保证在多线程环境下变量只对不用线程的可见性,基于jmm的抽象内存模型,volatile变量可以保证原子操作结果能够及时的从线程本地内存刷新到主内存,并对其他线程立即可见。从原理角度看,被volatile修饰的编程在编译时会加入一个lock指令,这个指令在jvm及硬件层面可以保证两点:一是立即...原创 2018-07-22 09:07:10 · 130 阅读 · 0 评论 -
Java-AQS
个人理解记录aqs是juc包的基础类,它向上层组件提供基础的同步服务。aqs基于一个状态变量,一个同步队列和一组状态操作和一组同步方法组成。基本的原理是通过同步操作实现同步元语,如果获取状态失败,则将当前线程构造成一个node节点后利用cas加入到同步队列的尾部并挂起,每个节点包括当前线程的引用、aqs内部维护了同步队列的头节点和尾节点,头节点是成功获取锁或状态的节点,头节点释放锁后唤醒其...原创 2018-07-22 09:08:19 · 1550 阅读 · 0 评论 -
Java-Lock独占锁与共享锁原理
个人理解记录ReentrantLock基于aqs实现,他的基本原理是aqs的status为0时表示锁被占用,为1时表示锁被释放。ReentrantLock在使用时需要显式的获取和释放锁,一般用try finally来实现,相对于synchronized,reentrantlock提供了功能更强大的api,例如超时锁、可中断锁、公平锁、非公平锁、非阻塞锁获取等等,ReentrantLock是独占...原创 2018-07-22 09:15:22 · 8815 阅读 · 3 评论 -
Java-Lock超时锁和可中断锁原理
个人理解记录超时锁的基本原理与独占锁基本相同,不同之处在于“超时”,在调用doAcquireNanos时,首先记录下调用方法的时间,然后尝试获取锁,如过获取成功则直接返回,如果获取失败,判断超时时间是否为0,如果是,则时间超时,返回false,如果不是,则获取当前时间-进入方法的时间,然后在用超时时间-这个结果,得到超时剩余时间,如果剩余超时时间大于1000毫秒,则利用LockSupport挂...原创 2018-07-22 09:17:50 · 6111 阅读 · 0 评论 -
Java-读写锁原理
个人理解记录J.U.C提供了一个ReentrantReadWriteLock读写锁,这个读写锁也是基于AQS实现的,在获取读锁时,如果写锁以及被获取,那么获取读锁的线程将被挂起,在获取写锁时,如果存在读锁或者写锁切当前线程不是获取写锁的线程,那么获取读锁的线程也会被挂起。 因为读写锁时基于AQS实现,也就是基于状态实现的,所以jkd将一个状态变量按照高12位和低12位分开,高12位用来存储读...原创 2018-07-22 09:18:52 · 275 阅读 · 0 评论 -
Java-Lock/Condition原理
个人理解记录在传统的synchronized中,可以通过wait/notify/notifyAll进行等待通知操作,但synchronized只提供了一个同步队列和一个等待/通知队列,Lock则提供了一个同步队列和多个等待/通知队列模型。 Condition对象是从Lock中获取,其返回的实际上是AQS的内部类ConditionObject,因为Condition机制依赖于AQS基于状态的同...原创 2018-07-22 09:20:02 · 2163 阅读 · 1 评论 -
Java-JVM类加载过程
个人理解记录jvm的类加载采用双亲委派模型,当需要加载一个类时,首先交由父类加载器去加载,只有当父类加载器无法加载时,子类加载器才去加载,这种机制可以有效避免重复加载,保证jvm的安全性。类加载器主要分为三种,bootstrap类加载器,负责加载java核心类库,extclassloader,负责加载扩展类库,apppclassloader负责加载classpath下的类,也就是应用本身的...原创 2018-07-22 09:21:20 · 206 阅读 · 0 评论 -
Java-JVM内存区域划分
个人理解记录程序计数器:线程私有的内存区域,每个线程在执行时都有自己的程序计数器,主要作用是记录当前线程执行的字节码的行号,在cpu进行线程切换/恢复时,使程序能够恢复到正确的位置执行,它是内存区域中唯一一块不会抛出异常的。虚拟机栈:线程私有的内存区域,是方法调用的抽象,每个方法调用对应一个栈帧,栈帧中存储局部变量表/方法返回地址等信息,一次方法调用对应一个栈帧的入栈,一次方法调用的完成对...原创 2018-07-22 09:22:18 · 179 阅读 · 0 评论 -
Java并发-再探JMM
Java内存模型个人理解,Java内存模型应该是Java并发编程中最难理解的一个概念之一。由于最近准备换工作,所以,按照惯例有复习了一下Java并发相关的知识(《Java并发编程的艺术》以及极客时间王宝令老师的《Java并发编程实战》),在复习的过程中,我发现《Java并发编程的艺术》中介绍JMM时,引入了很多晦涩难懂的知识,比如内存屏障等等,让人看的一头雾水,所以决定从更加宏观的角度去总结JM...原创 2019-08-21 23:11:28 · 174 阅读 · 0 评论 -
Java并发-join
join的作用join的作用是将另一线程加入到当前线程中,并串行执行。public class JoinTest { public static void main(String[] args) throws Exception{ Thread thread = new Thread(new JoinTask()); thread.start();...原创 2018-04-07 11:37:34 · 676 阅读 · 0 评论 -
Java并发-线程优先级
线程的优先级表示当前线程的重要程度,是客户端代码对操作系统任务调度器的一种简易,理论上,优先级越高的线程,cpu时钟的机会越大。线程优先级取之从1-10,优先级一次递增,但查阅相关资料后发现,多数线程调度器会忽略指定但优先级,而使用默认统一的线程优先级 5。下面看一个代码实例(摘自《Java编程思想》第四版):PriorityDemo(int priority) { ...原创 2018-04-06 09:01:07 · 347 阅读 · 0 评论 -
JVM-垃圾回收算法
跟踪收集器跟踪收集器采用集中式的管理方式,全局记录每个对象的引用状态,执行时,把一系列GC Root对象作为起点,向下搜索引用链,如果一个对象到GC Root之间没有任何引用链,那么这个对象就可以被回收。此类回收算法有三种:标记-清除、标记-复制和标记-整理。标记-清除标记清除是最基本的收集算法,其他算法都是以这种思想为基础。标记-清除算法分为两个节点:标记和清除。首选标记出需要回收的对象,然后对这原创 2016-11-19 16:54:38 · 229 阅读 · 0 评论 -
JVM-性能调优
JVM调优主要是针对内存管理,包括各个代的大小分片和GC的选择。由于GC发生时会导致应用进程被挂起,所有,JVM调优的主要目的就是尽量减小GC对应用进程的影响,减少Full GC,避免Stop-The-World的放生。常用调优参数-Xms,-Xmx:配置堆内存大小。通常为了避免在运行时频繁的分配堆内存,会将这两个参数设置相同的值。-Xmn:配置新生代空间的大小。新生代Eden,From,To三个区原创 2016-11-19 19:42:36 · 430 阅读 · 0 评论 -
Java并发-守护线程(Daemon)
Deamon线程通常是一种在后台提供通用服务的线程,当程序中的非后台线程全部终止时,deamon线程也就终止了。setDaemon(boolean isDaemon)方法的一段注释:The Java Virtual Machine exits when the only threads running are all daemon threads.意思就是当运行中的线程只剩下守护线程时...原创 2018-04-07 14:45:12 · 739 阅读 · 0 评论 -
Java并发-异常处理
由于异常不能跨线程传递,这就导致不能在主线程中处理子线程的异常,就像下面这样class ExceptionTask implements Runnable { @Override public void run() { System.out.println("Exception Task "); throw new RuntimeExceptio...原创 2018-04-07 21:13:08 · 812 阅读 · 0 评论 -
Java并发-ThreadLocal
ThreadLocal的作用作用是为每个线程保存线程私有数据。可以把ThreadLocal理解为一个Map,其中key为当前线程,value为要存储的数据。下面是摘自《Java编程思想》中的一段示例代码:public class ThreadLocalTest { public static void main(String[] args) throws Exceptio...原创 2018-04-08 09:51:20 · 485 阅读 · 0 评论 -
Java并发-资源共享与锁同步
并发编程中一个最主要的场景和挑战就是对共享资源对同步访问控制,同步访问控制是保证程序线程安全的最重要手段。在jdk1.5+中,主要提供了两种同步控制方式:synchronized关键字Lock接口其中,synchronized由可以分为:同步代码块/普通同步方法和静态同步方法三种,下面分别来看一下这集中同步控制机制的使用方法。普通同步方法这种方式是最常用的同步方式,通过在...原创 2018-04-08 18:33:09 · 1409 阅读 · 1 评论 -
Java并发-简介
随着整个社会的不断发展,软件已经成文人们日常生活中不可或缺对一部分。随之而来的是计算机技术的不断发展和人们日益增长的对于软件的要求,例如,为了提高计算机的处理能力,以冯·诺伊曼体系为基础的计算机不断发展为多核/多处理的计算机;人们对软件的友好性/数据处理能力等的要求不断提示。Java作为一门撑起互联网及软件业半边天的编程语言自然也要适应不断变化的世界,Java并发多线程技术在某种程度上算是这一...原创 2018-04-01 21:12:13 · 172 阅读 · 0 评论 -
Java并发-volatile
volatile是Java并发编程中一个很重要的成员,可以把它理解为一个轻量级的synchronized。volatile的作用有两个:保证变量的内存可见性防止指令重排序保证变量的内存可见性由于每个线程都有自己的本地线程缓存,当操作主内存中的数据时,会从主内存中复制数据到本地线程缓存中再进行操作。在多线程环境下,如果多个线程同时操作主内存中的同一块内存,就会造成多个线程间...原创 2018-04-14 13:25:43 · 184 阅读 · 0 评论 -
Java并发-synchronizd锁原理
synchronized在印象中是一个解决线程安全问题对神器,但它的效率却不怎么高。在jdk1.6以后,synchronized已经不再是一个简单粗暴的线程锁了,通过引入偏向锁/轻量级锁等机制对其进行了一系列优化。synchronized的用法synchronized的用法主要有三种静态同步方法普通同步方法同步代码块这三种应用形式的区别在于静态同步方法用的锁对象是...原创 2018-04-14 22:04:27 · 626 阅读 · 0 评论 -
Java并发-JMM
JMM是Java Memory Model的缩写,即Java内存模型。JMM是理解并发及同步问题的基础,只有理解来JMM,才能更好的理解线程间的同步和通信以及能够更快的定位多线程编程中出现的问题。CPU多级缓存现代CPU的运行速度极快,但通常情况下,计算机主内存的数据读写速度跟不上CPU的数据处理速度(相差几个数量级),为了高效利用cpu资源,提供运算速度,在主内存的基础上还会增加多层...原创 2018-04-11 08:31:44 · 202 阅读 · 0 评论 -
Java并发-线程的创建和终止
线程是操作系统的最小执行单元,每个线程都归属于一个进程,一个进程往往是一个独立的服务。创建线程创建线程的过程分两步:声明任务和启动线程。声明任务是定义线程需要执行的具体内容,启动线程是将任务托管到线程上交给操作系统去执行。声明任务声明任务的方式有三种,分别是:继承Thread类实现Runnable接口实现Callable接口下面分别看一下这三种方式的使用:...原创 2018-04-04 08:50:28 · 1165 阅读 · 0 评论 -
Java并发-AQS及各种Lock锁的原理
什么是AQSAQS是AbustactQueuedSynchronizer的简称,它是一个Java提高的底层同步工具类,用一个int类型的变量表示同步状态,并提供了一系列的CAS操作来管理这个同步状态。AQS的主要作用是为Java中的并发同步组件提供统一的底层支持,例如ReentrantLock,CountdowLatch就是基于AQS实现的,用法是通过继承AQS实现其模版方法,然后将子类作为同...原创 2018-04-18 08:13:55 · 37956 阅读 · 22 评论 -
Java并发-线程休眠
休眠是让线程终止执行给定的时间。Java提供了两种方式来实现线程休眠:Thread.sleep(long time)TimeUnit.SECONDS.sleep(long time) 其中,TimeUnit的JDK1.5引入的,并且也是推荐使用的,因为它提供来更好的可读性。public class SleepDemo implements Runnable{ @Overri...原创 2018-04-06 08:05:32 · 385 阅读 · 0 评论 -
JVM-内存模型
JVM内存模型 方法区也称永久代,存放JVM加载的类的信息、静态变量和常量,是线程的共享区域。方法区的大小默认是16MB到64MB,可以通过-XX:PermSize和-XX:MaxPermSize来修改。运行时常量池是方法区的一部分,用于存储由编译器生成的各种字符常量,当类被加载时,类中的字符常量会被放入方法区的常量池中。虚拟机栈描述了Java方法的内存模型,当一个方法被调用时,就会创建一个“栈帧原创 2016-11-19 12:36:41 · 514 阅读 · 0 评论