java基础
攀攀攀啦
这个作者很懒,什么都没留下…
展开
-
volatile问题汇总
volatile作用可见性:所有线程都能看到共享内存的最新状态,不保证操作的原子性。防止指令重排。volatile原理从Java内存模型理解,volatile要求d读操作(read、load、use),写(assign、store、write)动作必须连续出现,从而保证读操作会先刷新工作内存,写操作会立即同步到主内存。通过内存屏障控制CPU的store buffer和invalid queue的行为来防止指令重排。Store buffer 和Invalid QueueCPU修改Cac原创 2020-09-27 23:20:29 · 321 阅读 · 0 评论 -
ThreadLocal分析
ThreadLocal提供了线程共安全共享全局变量的方法,TreadLocal对象都是是线程私有的,与普通变量不同之处在于每个线程读取的变量是相互独立的,通过get和set方法得到的都是当前线程对应的值。ThreadLocal结构ThreadLocal可以通过两种方法来设计:ThreadLocal看作一个map,其中key就是当前线程,value就是需要存储的对象。这种方案虽然能够为每个线程提供私有的变量但是ThreadLocal会在多个线程中共享,这里还需要使用线程安全的map来实现。每个线程包原创 2020-09-09 23:53:01 · 205 阅读 · 0 评论 -
抽象类和接口
定义抽象类:含abstract修饰符的class即为抽象类,abstract类不能创建实例,含有abstract方法的类必须定义为抽象类,抽象类中的方法不必是抽象的。抽象方法必须在子类中实现,如果子类没有实现抽象类的抽象方法,那么子类也必须是抽象类型。接口:接口是抽象类的一种特列,接口所有方法都必须是抽象的。接口中的方法默认是public abstract类型,接口中的成员变量默认是private static final类型。设计目的接口的设计目的是对类进行约束,强制要求不同的类具有不同的行为,接原创 2020-09-09 22:45:33 · 405 阅读 · 0 评论 -
Semaphore安全释放
Semaphore应该比较熟悉了,从学习操作系统时就听过了,可以控制并行线程的数量。常用的使用方法如下public class Main { static Semaphore semaphore = new Semaphore(1); public static void doBusinessMethod(String str) { try { semaphore.acquire(1); businessMethod(s原创 2020-08-31 23:13:24 · 1108 阅读 · 0 评论 -
基于AQS的信号量简单实现
学习过AQS之后,对其实现有一些了解了,虽然jdk中已经提供了很多同步工具,但是为了锻炼代码能力,完全处于学习的目的分析这些同步工具的设计方法,并结合AQS实现简单版本的同步工具。下面会通过AQS实现一个信号量同步工具,后续还会有其他同步工具的实现。首先需要了解AQS的基本用法,既然是第一篇那么先介绍以下如何使用AQS。高性能锁有以下几个需要关注的点:共享变量、互斥访问、查看持有锁的线程、自旋、等待队列、公平性。AQS中围绕这些点进行的封装,提供了一些很方便的接口,我们只需要借助以下这些接口即可完成特殊原创 2020-07-26 16:20:36 · 288 阅读 · 0 评论 -
CountedCompleter使用方法小洁
CountedCompleter将结果合并从任务分解计算的过程中分离出来,只要每个子任务能保存状态,那么通过合并逻辑,就可以在任何时候将结果合并。CountedCompleter中如何知道子任务计算完成?它使用了一个孩子兄弟表示的树形结构。用一个变量统计当前一个节点的子节点个数,兄弟节点通过判断计算器可以知道其他兄弟任务是否完成,如果没有完成就将计数器减一表示自己已经完成。如果完成了就将所有兄弟任务的结果合并(合并顺序可以自定义),然后递归判断父节点的情况。这样最终就可以将任务结果合并到根节点。因此原创 2020-05-28 13:06:11 · 1367 阅读 · 0 评论 -
CopyOnWriteArrayList分析
引用源码的注释This is ordinarily too costly, but may be more efficient than alternatives when traversal operations vastly outnumber mutations, and is useful when you cannot or don't want to synchronize tr...原创 2019-12-13 23:56:08 · 148 阅读 · 0 评论 -
Java引用类型分析
在Java中有几种不同强度的引用类型包括:强引用,软引用,弱引用,终结方法引用,虚引用。因为引用类型的实现和垃圾回收密切相关,所以很多工作都需要在vm中完成。下面将分析这些引用。1、强引用(StrongReference):普通的引用,回收器永远不会将强引用置空。被StrongReference引用的对象,在GC标记过程中属于(强)可达对象。2、软引用(SoftReference):回收器...原创 2019-12-09 12:02:27 · 149 阅读 · 0 评论 -
JVM学习笔记(一)方法区
虚拟机分的内存分为:方法区、堆、虚拟机栈、本地方法栈、程序计数器。其中方法区和堆是重点,相对理解起来也更复杂。方法区:是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。方法区只是虚拟机规范中定义的一种概念区域,只规定了方法区的功能,实际实现有很大区别。例如,之前将hotspot中的方法区成为永久代,但是在后来永久代被取消,因为将永久代作为...原创 2019-11-19 15:52:47 · 158 阅读 · 0 评论 -
对协程的初步理解
首先要强调的是协程不是线程,如果一定要将它与线程作比较,那么可能会陷入泥潭,个人认为单纯将协程看作一种编程方式感觉更容易理解. 协程的优点包括:协程更加轻量,创建成本更小,降低了内存消耗减少了 CPU 上下文切换的开销减少同步加锁,整体上提高了性能可以按照同步思维写异步代码 协程这么厉害,那到底有什么用呢?协程有一个很重要的场景,就是IO密集型任务。以前使用同步 IO 的情况下...原创 2019-11-01 17:02:10 · 300 阅读 · 0 评论 -
JVM知识点汇总
java内存1、java虚拟机内存包括哪些区域? 虚拟机所管理的内存包含一下几个运行时数据区域程序计数器线程私有如果正在执行Java方法,则记录正在执行的字节码指令的地址,如果正在执行的是Native方法,计数器的值为空。此区域不会产生OutOfMemoryError异常。java虚拟机栈线程私有虚拟机栈描述的是java方法执行的内存模型:每个方法的同时都会创建一个栈...原创 2019-08-28 19:41:35 · 140 阅读 · 0 评论 -
AQS源码分析
参考博客AbstractQueuedSynchronizer详细分析 博客中源码分析的很详细,但是还是有一些地方漏掉了,本文作为一个补充。唤醒节点 接下来看看如何唤醒后继节点。private void unparkSuccessor(Node node) { int ws = node.waitStatus; if (ws < 0)...原创 2019-07-31 18:02:51 · 283 阅读 · 0 评论 -
《java并发编程之美》ConcurrentLinkedQueue笔记
《java并发编程之美》中对于ConcurrentLinkedQueue的讲解中说offer操作只要保证tail节点的可见性和原子性即可。我认为即使通过volatile和CAS保证可见性和原子性,插入元素也存在线程安全问题。 下面分析为什么会存在问题,offer方法添加节点可以简化为下面3个步骤找到最后一个节点p通过cas设置p的后继节点将p设置为tail 在步骤1和步骤2之间如果...原创 2019-07-25 14:23:57 · 224 阅读 · 0 评论 -
PhantomReference分析
本文介绍了PhantomReference的作用,以及它与WeakReference区别。同时纠正网上关于引用对象回收时间的错误说法(个人认为不正确)。本文没有考虑finalize方法是如何实现(具体可以参考Finalizer和FinalReference的介绍),只考虑finalize方法执行条件和结果。术语reference(phantom reference):引用对象本身,也就是We...原创 2019-07-19 15:24:18 · 2563 阅读 · 0 评论