自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 12_ConcurrentHashMap

ConcurrentHashMap 为什么要用ConcurrentHashMap HashMap线程不安全,而Hashtable是线程安全,但是它使用了synchronized进行方法同步,插入、读取数据都使用了synchronized,当插入数据的时候不能进行读取(相当于把整个Hasht...

2019-11-26 21:46:51 120 0

原创 垃圾回收机制与调用System.gc()区别

java垃圾回收与System.gc()介绍 垃圾回收机制: 1.垃圾收集算法的核心思想 Java语言建立了垃圾收集机制,用以跟踪正在使用的对象和发现并回收不再使用(引用)的对象。 该机制可以有效防范动态内存分配中可能发生的两个危险:因内存垃圾过多而引发的内存耗尽,以及不恰当的内存释放...

2019-10-24 20:51:51 1397 0

原创 内存抖动

内存频繁的分配和回收,频繁的gc会导致UI卡顿,严重的时候导致out of memory error(内存超过分配的最大值)

2019-10-24 20:49:09 662 0

原创 多线程断点续传原理

断点续传的实现? 断点续存类似于游戏里的存档 (1)如果游戏不能存档,那么则意味着我们下次游戏的时候,这次已经通过的4关的进度将会丢失,无法接档。 (2)如果游戏不能存档,那么则意味着我们下次游戏的时候,这次已经通过的4关的进度将会丢失,无法接档。 “断点续传”最最基础的原理:我们要在...

2019-10-24 20:46:42 351 0

原创 如何保证多线程读写文件的安全?

我们看多个线程共用一个FileWriter写入同一个文件的情况: 在Writer抽象类里面有一个protected类型的lock属性,是一个简单Object对象。 JDK里对这个lock属性的描述如下:“用于同步针对此流的操作的对象。为了提高效率,字符流对象可以使用其自身以外的对象来保护关键部...

2019-10-24 20:44:56 1237 0

原创 谈谈你对多线程同步机制的理解?

线程同步是为了确保线程安全,所谓线程安全指的是多个线程对同一资源进行访问时,有可能产生数据不一致问题,导致线程访问的资源并不是安全的。(如果多线程程序运行结果和单线程运行的结果是一样的,且相关变量的值与预期值一样,则是线程安全的。) java中与线程同步有关的关键字/类包括: volatile...

2019-10-24 20:40:35 340 0

原创 谈谈你对并发编程的理解并举例说明

一、为什么需要并发 并发其实是一种解耦合的策略,它帮助我们把做什么(目标)和什么时候做(时机)分开。这样做可以明显改进应用程序的吞吐量(获得更多的CPU调度时间)和结构(程序有多个部分在协同工作)。 二、误解和正解 最常见的对并发编程的误解有以下这些: 1.(错误)并发总能改进性能。 ...

2019-10-23 20:43:58 740 0

原创 多线程有什么要注意的问题?

并发问题,安全问题,效率问题。

2019-10-23 20:42:55 147 0

原创 多线程同步机制

在需要同步的方法的方法签名中加上 synchronized关键字 使用synchronized关键字对需要进行同步的代码块进行同步 使用java.util.concurrent.lock包中Lock对象(JDK1.8) ...

2019-10-23 20:40:57 60 0

原创 谈谈对多线程的理解

用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现。 说这个话其实只有一半对,因为反应“多角色”的程序代码,最起码每个角色要给他一个线程吧,否则连实际场景都无法模拟,当然也没法说能用单线程来实现:比如最常见的“生产者,消费者模型”。 基本知识: ...

2019-10-23 20:36:13 173 0

原创 什么是线程池,如何使用?

一、为什么用线程池 1、创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处理效率 例如: 记创建线程消耗时间T1,执行任务消耗时间T2,销毁线程消耗时间T3 如果T1+T3>T2,那么是不是说开启一个线程来执行这个任务太不划算了! 正好,线程池缓存线程,可用...

2019-10-23 20:25:11 201 0

原创 对象锁和类锁是否会互相影响?

对象锁: Java的所有对象都含有1个互斥锁,这个锁由JVM自动获取和释放。 线程进入synchronized方法的时候获取该对象的锁,当然如果已经有线程获取了这个对象的锁,那么当前线程会等待; synchronized方法正常返回或者抛异常而终止,JVM会自动释放对象锁。 这里也体现了用...

2019-10-23 20:20:11 156 0

原创 怎么避免死锁?

一、死锁的定义 多线程以及多进程改善了系统资源的利用率并提高了系统的处理能力。然而,并发执行也带来了新的问题——死锁。所谓死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。下面我们通过一些实例来说明死锁现象。 先看生活中的一个实例,2个人一起吃饭但...

2019-10-23 20:19:24 113 0

原创 死锁的四个必要条件?

产生死锁的原因主要是: 因为系统资源不足。 进程运行推进的顺序不合适。 资源分配不当等。 如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。 产生死锁的四个必要条件: 互斥条件:一...

2019-10-23 20:16:36 34 0

原创 lock原理

ReentrantLock的调用过程 经过观察ReentrantLock把所有Lock接口的操作都委派到一个Sync类上,该类继承了AbstractQueuedSynchronizer: staticabstractclassSyncextendsAbstractQueuedSynchron...

2019-10-23 20:15:54 95 0

原创 ReentrantLock的内部实现

java可重入锁-ReentrantLock实现细节 ReentrantLock支持两种获取锁的方式,一种是公平模型,一种是非公平模型。在继续之前,咱们先把故事元素转换为程序元素。 公平锁模型: (占用锁时,状态state +1 ,其他想成想要使用,要排队,当在使用的时候再次进入,状态s...

2019-10-23 20:11:52 118 0

原创 ReentrantLock 、synchronized和volatile比较

Lock 作用:显式加锁 原理 (1)通过同步器AQS(AbstractQueuedSynchronized类)来实现的,AQS根本上是通过一个双向队列来实现的 (2)线程构造成一个节点,一个线程先尝试获得锁,如果获取锁失败,就将该线程加到队列尾部 (3)非公平锁的lock方法,调用的s...

2019-10-21 22:34:08 77 0

原创 谈谈NIO的理解

NIO(Non-Blocking IO)的IO处理机制与以往的标准IO机制(BIO,Blocking IO)不同的是,新的机制把重点放在了如何缩短抽象与现实之间的距离上面。 NIO中提出了一种新的抽象,NIO 弥补了原来的BIO的不足,它在标准 Java 代码中提供了高速的、面向块的I/O。 ...

2019-10-21 22:32:19 173 0

原创 谈谈volatile关键字的用法

谈谈volatile关键字的作用 volatile关键字经常在并发编程中使用,其特性是保证可见性以及有序性 1.volatile保证可见性 一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义: 1)保证了不同线程对这个变量进行操作时的可见性,...

2019-10-21 22:29:52 184 0

原创 volatile的原理

Volatile工作原理分析 1.主要作用是保证变量在多线程之间的可见性; 2.volatile在concurrent包中起着举足轻重的作用,为大量的并发类提供了有力的援助; 接下来我们从了解CPU缓存开始,然后再深入原理剖析,循序渐进的了解volatile; 基础知识: CPU...

2019-10-21 22:25:52 53 0

原创 Java中对象的生命周期

Java对象的生命周期 在Java中,对象的生命周期包括以下几个阶段: 1.创建阶段(Created) 2.应用阶段(In Use) 3.不可见阶段(Invisible) 4.不可达阶段(Unreachable) 5.收集阶段(Collected) 6.终结阶段(Finalized)...

2019-10-21 22:24:06 68 0

原创 synchronized与Lock的区别

区别: 1.用法上的不同: (1)使用范围不同:synchronized既可以加在方法上,也可以加载特定代码块上,而lock需要显示地指定起始位置和终止位置。 (2)实现方式不同:synchronized是托管给JVM执行的,lock的锁定是通过代码实现的,它有比synchronized更精...

2019-10-21 22:22:14 38 0

原创 synchronized 和volatile 关键字的区别

volatile和synchronized特点 首先需要理解线程安全的两个方面:执行控制和内存可见。 (1)执行控制的目的是:控制代码执行(顺序)及是否可以并发执行。 (2)内存可见控制的是:线程执行结果在内存中对其它线程的可见性。(根据Java内存模型的实现,线程在具体执行时,会先拷贝...

2019-10-21 22:21:43 170 0

原创 8_LinkedList

LinkedList类是双向列表,列表中的每个节点都包含了对前一个和后一个元素的引用. 继承extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.S...

2019-10-09 21:55:52 25 0

原创 9_ArrayList

ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态增长。它继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。 ArrayList 继承了AbstractL...

2019-10-09 21:50:01 33 0

原创 如何绕过9.0限制

如何限制: 1.阻止java反射和JNI 2.当获取方法或Field时进行检测 (怎么检测: (1)区分出是系统调用还是开发者调用:根据堆栈,回溯Class,查看ClassLoader是否是BootStrapClassLoader。 (2)区分后,再区分是否是hidden api:Met...

2019-10-09 21:46:05 584 0

原创 耦合的概念你是怎么理解的?要不要完全避免耦合?

耦合:是对模块间关联程度的度量。耦合的强弱取决与模块间接口的复杂性、调用模块的方式以及通过界面传送数据的多少。 模块间的耦合度是指模块之间的依赖关系,包括控制关系、调用关系、数据传递关系。模块间联系越多,其耦合性越强,同时表明其独立性越差。降低模块间的耦合度能减少模块间的影响,防止对某一模块修改所...

2019-10-09 21:36:04 149 0

原创 CAS介绍

CAS是英文单词Compare And Swap的缩写,翻译过来就是比较并替换。 CAS机制当中使用了3个基本操作数:内存地址V,旧的预期值A,要修改的新值B。 更新一个变量的时候,只有当变量的预期值A和内存地址V当中的实际值相同时,才会将内存地址V对应的值修改为B。 例子: 在内存地址V...

2019-10-09 21:33:00 28 0

原创 Layout_gracity和gravity的区别

两者的可选值差不多。 gravity:指的是文字在控件中的对齐方式。或者子view在父view的对齐方式(在父view中设置)。 layout_gravity:是LineaLayout的属性,是用于指定控件在布局中的对齐方式。当LineaLayout的排列方式是horizontal时,之后在垂...

2019-10-09 20:59:17 111 0

原创 说说你对Java反射的理解

public class ReflectCase { public static void main(String[] args) throws Exception { Proxy target = new Proxy(); Method method = ...

2019-10-09 20:41:46 1232 0

原创 8_Activity的setContentView源码原理

setContentView是怎么把视图绘制出来的 Activity#setContentView(int resID)方法会调用getWindow().setContentView(layoutResID) 其中有几个需要注意的: getWindow():返回的是new PhoneWind...

2019-09-26 23:12:31 37 0

原创 9_WindowManagerServer源码原理

Window是一个抽象的概念,每个Window都对应着一个View和一个ViewRootImpl,Window和View通过ViewRootImpl来建立联系,因此Window并不是真实存在的,它是以View的形式存在的。 Window中使用的是桥接模式,在实际使用中无法直接访问Window,对...

2019-09-26 23:08:55 34 0

原创 5_RxJava源码原理

RxJava 变换操作符 map、flatMap、concatMap buffer 谈谈对于RxJava的理解,可以尝试描述一些使用场景,以及原理 操作符有几大类: 创建操作符 变换操作符 组合/合并操作符 功能性操作符 过滤操作符 条件/布尔操作符 实例开发应用场景有: 线...

2019-09-26 22:13:59 46 0

原创 10_Activity启动流程源码原理

对Activity启动流程的了解:AMS和ActivityThread涉及到的源码? 我们以启动微信为例,看看启动流程是怎样的。 简单概括启动微信的流程就是: 1.Launcher通知AMS 要启动微信了,并且告诉AMS要启动的是哪个页面也就是首页是哪个页面 2.AMS收到消息告诉Laun...

2019-09-25 23:13:43 41 0

原创 11_Google Protocol Buffer

Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准。他们用于 RPC 系统和持续数据存储系统。 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 ...

2019-09-24 22:00:43 41 0

原创 14_LeakCannary原理

leakCannary原理,如何判断一个对象是否被回收?如何触发手动gc leakCanary原理: 主要是在Activity的&onDestroy方法中,手动调用 GC,然后利用ReferenceQueue+WeakReference,来判断是否有释放不掉的引用,然后结合dump m...

2019-09-24 21:55:57 61 0

原创 3_Eventbus源码原理

用过EventBus吗?实现原理是什么?有什么优缺点? 1.EventBus.getDefault().register(this); 其中getDefault()是一个单例方法,保证当前只有一个EventBus实例: public static EventBus getDefau...

2019-09-24 21:50:53 43 0

原创 10-HashMap

HashMap是用哈希表(直接一点可以说数组加单链表)+红黑树实现的map类。 HashMap构造器 static final float DEFAULT_LOAD_FACTOR = 0.75f; final float loadFactor; public HashMap() { ...

2019-09-10 23:09:46 61 0

原创 7-HashSet

HashSet中不允许有重复元素,这是因为HashSet是基于HashMap实现的,HashSet中的元素都存放在HashMap的key上面,而value中的值都是统一的一个private static final Object PRESENT = new Object();。HashSet跟Ha...

2019-09-10 22:59:58 41 0

原创 2-Collection

Collection简介 是一个接口,继承Iterable(有一个Iterator方法)。Collection是最基本集合接口,它定义了一组允许重复的对象。Collection接口派生了两个子接口Set和List,分别定义了两种不同的存储方式。 ...

2019-09-10 22:57:19 19 0

提示
确定要删除当前文章?
取消 删除