微信
手机版
网站地图

李秉宪,Android中高级面试题预备收拾共享,狮子

2019-03-31 11:47:27 投稿人 : admin 围观 : 257 次 0 评论

AndroidActivity生命周期

onStart()与onResume()有什么差异?

onStart()是activity界面被显示出来的时分履行的,但不能与它交互;

onResume()我的傻瓜娇妻是当该activity与用户能进行交互时被履行,用户能够取得activity的焦点,能够与用户交互。

Activity发动流程

startActivity终究都会调用startActivityForResult,经过ActivityManagerProxy调用system_server进程中ActivityManagerService的startActvity办法,假如需求发动的Activity地点进程未发动,则调用Zygote孵化运用进程,进程创立后会调用运用的ActivityThread的main办法,main办法调用attach办法将运用进程绑定到ActivityManagerService(保存运用的ApplicationThread的署理方针)并敞开loop循环接纳音讯。ActivityManagerService经过ApplicationThread的署理发送Message通知发动Activity,ActivityThread内部Handler处理handleLaunchActivity,顺次调用performLaunchActivity,handleResumeActivity(即activity的onCreate,onStart,onResume)。

深化了解Activity发动流程

Android类加载器

Android渠道上虚拟机运转的是Dex字节码,一种对class文件优化的产品,传统Class文件是一个Java源码文件会生成一个.class文件,而Android是把一切Class文件进行兼并,优化,然后生成一个终究的class.dex,意图是把不同class文件重复的东西只需保存一份,假如咱们的Android运用不进行分dex处理,终究一个运用的apk只会有一个dex文件。

Android中常用的有两品种加载器,DexClassLoader和PathClassLoader,它们都承继于BaseDexClassLoader。差异在于调用父类结构器时,DexClassLoader多传了一个optimizedDirectory参数,这个目录有必要是内部存储途径,用来缓存体系创立的Dex文件。而PathClassLoader该参数为null,只能加载内部存储目录的Dex文件。所以咱们能够用DexClassLoader去加载外部的apk。

Android音讯机制

Android是依据事情驱动的,即一切Activity的生命周期都是通李秉宪,Android中高级面试题准备拾掇同享,狮子过Handler事情驱动的。loop办法中会调用MessageQueue的next办法获取下一个message,当没有音讯时,依据Linux pipe/epoll机制会堵塞在loop的queue.干比next()中的nativePollOnce()办法里,并不会耗费CPU。

IdleHandler (闲时机制)

IdleHandler是一个回调接口,能够经过MessageQueue的addIdleHandler添加完结类。当MessageQueue中的使命暂时处理完了(没有新使命或许下一个使命延时在之后),这个时分会回调这个接口,回来false,那么就会移除它,回来true就会在下次message处理完了的时分持续回调。

同步屏障机制(sync barrier)

同步屏障能够经过MessageQueue.postSyncBarrier函数来设置。该办法发送了一个没有target的Message到Queue中李秉宪,Android中高级面试题准备拾掇同享,狮子,在next办法中获取音讯时,假如发现没有target的Message,则在必定的时刻内越过同步音讯,优先履行异步音讯。再换句话说,同步屏障为Handler音讯机制添加了一种简略的优先级机制,异步音讯的优先级要高于同步音讯。在创立Handler时有一个async参数,传true表明此handler发送的时异步音讯。ViewRootImpl.scheduleTraversals办法就运用了同步屏障,保证UI制作优先履行。

View的制作原理

View的制作从ActivityThread类中Handler的处理RESUME_ACTIVITY事情开端,在履行performResumeActivity之后,创立Window以及DecorView并调用WindowManager的addView办法添加到屏幕上,addView又调用ViewRootImpl的setView办法,终究履行performTraversals办法,顺次履行performMeasure,performLayout,performDraw。也便是view制作的三大进程。

measure进程丈量view的视图巨细,终究需求调用setMeasuredDimension办法设置丈量的成果,假如是ViewGroup需求调用measureChildren或许measureChild办法然后核算自己的巨细。

layout进程是摆放view的进程,View不需求完结,一般由ViewGroup完结,在完结onLayout时能够经过getMeasuredWidth等办法获取measu李秉宪,Android中高级面试题准备拾掇同享,狮子re进程丈量的成果进行摆放。

draw进程先是制作布景,其次调用onDraw()办法制作view的内容,再然后调用dispatchDraw()调用子view的draw办法,终究制作滚动条。ViewGroup默许不会履行onDraw办法,假如复写了onDraw(Canvas)办法,需求调用 setWillNotDraw(false);清楚不需求制作的符号。

Android视图制作流程彻底解析,带你一步步深化了解View(二)

什么是MeasureSpec

MeasureSpec代表一个32位int值,高两位代表SpecMode(丈量方法),低30位代表SpecSize(详细巨细)。

SpecMode有三类:

首要getMeasureWidth()办法在measure()进程完毕后就能够获取到了,而getWidth()办法要在layout()进程完毕后才干获取到。别的,getMeasureWidth()办法中的值是经过setMeasuredDimension()办法来进行设置的,而getWidth()办法中的值则是经过视图右边的坐标减去左面的坐标核算出来的。

事情分发机制requestLayout,invalidate,postInvalidate差异与联络

相同点:三个办法都有改写界面的作用。

不同点:invalidate和postInvalidate只李秉宪,Android中高级面试题准备拾掇同享,狮子会调用onDraw()办法;requestLayout则会从头调用onMeasure、onLayout、onDraw。

调用了invalidate办法后,会为该View添加一个符号位,一起不断向父容器恳求改写,父容器经过核算得出自身需求重绘的区域,直到传递到ViewRootImpl中,终究触发performTraversals办法,景甜性感进行开端View树重绘流程(只制作需求重绘的视图)。

调用requestLayout办法,会符号当时View及父容器,一起逐层向上提交,直到ViewRootImpl处理该事情,ViewRootI黄勋哲mpl会调用三大流程,从measure开端,关于每一个含有符号位的view及其子View都会进行丈量onMeasure、布局onLayout、制作onDraw。

Android View 深度剖析requestLayout、invalidate与postInvalidate李秉宪,Android中高级面试题准备拾掇同享,狮子

Binder机制,同享内存完结原理

为什么运用Binder?

概念

进程阻隔

进程空间区分:用户空间(User Space)/内核空间(Kernel Space)

体系调用:用户态与内核态

原理

郑露莹

跨进程通讯是需求内核空间做支撑的。传统的 IPC 机制如管道、Socket 都是内核的一部分,因而经过内核支撑来完结进程间通讯自然是没问题的。可是 Binder 并不是 Linux 体系内核的一部分,那怎么办呢?这就得益于 Linux 的动态内核可加载模块(Loadable Kernel Module,LKM)的机制;模块是具有独立功用的程序,它能够被独自编译,可是不能独立运转。它在运转时被链接到内核作为内核的一部分运转。这样,Android 体系就能够经过动态添加一个内核模块运转在内核空间,用户进程之间经过这个内核模块作为桥梁来完结通讯。

在 Android 体系中,这个运转在内核空间,担任各个用户进程经过 Binder 完结通讯的内核模块就叫 Binder 驱动(Binder Dirver)。

那么在 Android 体系顶用户进程之间是怎么经过这个内核模块(Binder 驱动)来完结通讯的呢?莫非李秉宪,Android中高级面试题准备拾掇同享,狮子是和前面说的传统 IPC 机制相同,先将数据从发送方进程复制到内核缓存区,然后再将数据从内核缓存区复制到接纳方进程,经过两次复制来完结吗?明显不是,不然也不会有开篇所说的 Binder 在功用方面的优势了。

这就不得不通道 Linux 下的另一个概念:内存映射

Binder IPC 机制中涉及到的内存映射经过 mmap() 来完结,mmap() 是操作体系中一种内存映射的办法。内存映射简略的讲便是将用户空间的一块内存区域映射到内核空间。映射联络树立后,用户对这块内存区域的修正能够直接反应到内核空间;反之内核空间对这段区域的修正也能直接反应到用户空间。

一次完好的 Binder IPC 通讯进程一般是这样:

Binder通讯模型

Binder是依据C/S架构的,其间界说了4个人物:Client、Server、Binder驱动和ServiceManager。

ServiceManager是一个独自的进程,那么Server与ServiceManager通讯是靠什么呢?

当Android体系发动后,会创立一个名称为servicemanager的进程,这个进程经过一个约好的指令BINDERSETCONTEXT_MGR向Binder驱动注册,恳求成为为ServiceManager,Binder驱动会主动为ServiceManager创立一个Binder实体。并且赳赳这个Binder实体的引证在一切的Client中都为0,也就说各个Client经过这个0号引证就能够和ServiceManager进行通讯。Server经过0号引证向ServiceManager进行注册,Client经过0号引证就能够获取到要通讯的Server的Binder引证。

写给 Android 运用工程师的 Binder 原理剖析

一篇文章了解相见恨晚的 Android Binder 进程间通讯机制

序列化的办法

Serializable是Java供给的一个序列化接口,是一个空接口,用于标明方针是否能够支撑序列化,经过ObjectOutputStrean及ObjectInputStream完结序列化和反序列化的进程。留意能够为需求序列化的方针设置一个serialVersionUID,在反序列化的时分体系会检测文件中的serialVersionUID是否与当时类的值共同,假如不共同则阐明类发作了修正,反序列化失利。因而关于或许会修正的类最好指定serialVersionUID的值。

Parcelable是Android特有的一个完结序列化的接口,在Parcel内部包装了可序列化的数据,能够在Binder中自在传输。序列化的功用由writeToParcel办法来完结,终究经过Parcel的一系列write办法完结。反序列化功用由CREAOR来完结,其内部标明晰怎么创立序列化方针和数组,并经过Parcel的一系列read办法来完结反序列化的进程。

Fragment的懒加载完结

Fragment可见状况改动时会被调用setUserVisibleHint()办法,能够经过复写该办法完结Fragment的懒加载,但需求留意该办法或许在onVIewCreated之前调用,需求保证界面现已初始化完结的状况下再去加载数据,防止空指针。

Fragment的懒加载

RecyclerView与ListView(缓存原理,差异联络,优缺点)

缓存差异:

长处

RecylerView供给了部分改写的接口,经过部分改写,就能防止调用许多无用的bindView。

RecyclerView的扩展性更强壮(LayoutManager、ItemDecoration等)。

Android两种虚拟机差异与联络

Android中的Dalvik虚拟机相较于Java虚拟机针对手机的特色做了许多优化。

Dalvik依据寄存器,而JVM依据栈。在依据寄存器的虚拟机里,能够更为有用的削减冗余指令的分发和削减内存的读写拜访。

Dalvik经过优化,答应在有限的内存中一起运转多个虚拟机的实例,并且每一个 Dalvik运用作为一个独立的Linux进程履行。

java虚拟机运转的是java字节码。(王嘉艳java类会被编译成一个或多个字节码.class文件,打包到.jar文件中,java虚拟机从相应的.class文件和.jar文件中获取相应的字节码)

Dalvik运转的是自界说的.dex字节码格局。(java类被编译成.class文件后,会经过一个dx东西将一切的.class文件转换成一个.dex文件,然后dalvik虚拟时机从其间读取指令和数据)

Android开发之浅谈java虚拟机和Dalvik虚拟机的差异

adb常用指令行

查看当时衔接的设备:adb devices

袁克友

装置运用:adb install -r -r表明掩盖装置

卸载apk:adb uninstall

ADB 用法大全

apk打包流程

Android运用程序(APK)的编译打包进程

apk装置流程

APK首要由以下几部分组成:

其间占有较大内存的是res资源、lib、class.dex,因而咱们能够从下面的几个方面下手:

缓存的呼应头:

Cache-control:标明缓存的最大存活经常;

Date:效劳器通知客户端,该资源的发送时刻;

Expires:表明过期时刻(该字段是1.0的东西,当cache-control和该字段一起存在的条件下,cache-control的优先级更高);

Last-Modified:效劳器通知客户端,资源的终究修正时刻;

还有一个字段,这个图没给出,便是E-Tag:当时资源在效劳器的仅有标识,可用于判别资源的内容是否被修正了。

除以上呼应头字段以外,还需了解两个相关的Request恳求头:If-Modified-since、If-none-Match。这两个字段是和Last-Modified、E-Tag合作运用的。大致流程如下:

效劳器收到恳求时,会在200 OK中回送该资源的Last-Modified和ETag头(效劳器支撑缓存的状况下才会有这两个头哦),客户端将该资源保存在cache中,并记载这两个特点。当客户端需极上亲父要发送相同的恳求时,依据Date + Cache-control来判别是否缓存过期,假如过期了邵子晨,会在恳求中带着If-Modified-Since和If-None-Match两个头。两个头的值别离是呼应中Last-Modified和ETag头的值。效劳器经过这两个头判别本地资源未发作变化,客户端不需求从头下载,回来304呼应。

组件化

OkHttpClient经过newCall能够将一个Request构建成一瞋目切齿个Call,Call表明准备被履行的恳求。Call调用executed或enqueue会调用Dispatcher对应的办法在当时线程或许一步开端履行恳求,经过RealInterceptorChain取得终究成果,RealInterceptorChain是一个拦截器链,其间顺次包括以下拦截器:

okhttp源码解析

Retrofit的完结与原理

Retrofit选用动态署理,创立声明service接口的完结方针。当咱们调用service的办法时分会履行InvocationHandler的invoke办法。在这办法中:首要,经过method把它转换成ServiceMethod,该类是对声明办法的解析,能够进一步将设定参数变成Request ;然后韩国瑜伽妹,经过serviceMethod, args获取到okHttpCall 方针,实践调用okhttp的网络恳求办法就在该类中,并且会运用serviceMethod中的responseConverter对ResponseBody转化;终究,再把okHttpCall进一步封装成声明的回来方针(默许是ExecutorCallbackCall,将本来call的回调转发至UI线程)。

Retrofit2运用详解及从源码中解析原理

Retrofit2 彻底解析 探究与okhttp之间的联络

ARouter原理

或许是最详细的ARouter源码剖析

RxLifecycle原理

在Activity中,界说一个Observable(Subject),在不同的生命周期发射不同的事情;

经过compose操作符(内部实践上仍是依靠takeUntil操作符),界说了上游数据,当其接纳到Subject的特定事情时,撤销订阅;

Subject的特定事情并非是ActivityEvent,而是简略的boolean,它现已内部经过combineLast操作符进行了对应的转化。

RxJavaJava类的加载机制

程序在发动的时分,并不会一次性加载程序所要用的一切class文件,而是依据程序的需求,经过Java的类加载机制(ClassLoader)来动态加载某个class文件到内存傍边的,然后只要class文件被载入到了内存之后,才干被其它class所引证。所以ClassLoader便是用来动态加载class文件到内存傍边用的。

类从被加载到虚拟机内存中开端,到卸载出内存中止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、运用(Using)和卸载(Unloading)7个阶段。其间准备、验证、解析3个部分统称为衔接(Linking)。

Java中存在3品种加载器:

(1) Bootstrap ClassLoader : 将存放于 lib目录中的,或许被-Xbootclasspath参数所指定的途径中的,并且是虚拟机辨认的(仅依照文件名辨认,如 rt.jar 姓名不符合的类库即便放在lib目录中也不会被加载)类库加载到虚拟机内存中。发动类加载器无法被Java程序直接引证 。

(2) Extension ClassLoader : 将 libext目录下的,或许被java.ext.dirs体系变量所指定的途径中的一切类库加载。开发者能够直接运用扩展类加载器。

(3) Application ClassLoader : 担任加载用户类途径(ClassPath)上所指定的类库,开发者可直接运用。

每个ClassLoader实例都有一个父类加载器的引证(不是承继联络,是一个包括的联络),虚拟机内置的类加载器(Bootstrap ClassLoader)自身没有父类加载器,可是能够用做其他ClassLoader实例的父类加载器。

当一个ClassLoader 实例需求加载某个类时,它会企图在亲身查找这个类之前先把这个使命托付给它的父类加载器,这个进程是由上而下顺次查看的,首要由顶层的类加载器Bootstrap ClassLoader进行加载,假如没有加载到,则把使命转交给Extension ClassLoader加载,假如也没有找到,则转交给AppClassLoader进行加载,仍是没有的话,则交给托付的发起者,由它到指定的文件体系或许网络等URL中进行加载类。还没有找到的话,则会抛出CLassNotFoundException反常。不然将这个类生成一个类的界说,并将它加载到内存中,终究回来这个类在内存中的Class实例方针。

为什么运用双亲托付模型

JVM在判别两个class是否相一起,不只要判别两个类名是否相同,还要判别是否是同一个类加载器加载的。

在JDK1.6,JDK1.7中,HashMap选用数组+链表完结,即运用链表处理抵触,同一hash值的链表都存储在一个链表里。可是当坐落一个链表中的元素较多,即hash值持平的元素较多时,经过key值顺次查找的功率较低。而JDK1.8中,HashMap选用位数组+链表+红黑树完结,当链表长度超越阈值(8)时,将链表转换为红黑树,这样大大削减了查找时刻。

当链表数组的容量超越初始容量*加载因子(默许0.75)时,再散列将链表数组扩展2倍,把原链表数组的搬移到新的数组中。为什么需求运用加载因子?为什么需求扩容呢?因为假如填充比很大,阐明运用的空间许多,假如一向不进行扩容的话,链表就会越来越长,这样查找的功率很低,扩容之后,将本来链表数组的每一个链表分红奇偶两个子链表别离挂在新链表数组的散列方位,这样就削减了每个链表的长度,添加查找功率。

HashMap对错线程安全的,HashTable、ConcurrentHashMap是线程安全的。

HashMap的键和值都答应有null存在,而HashTable、ConcurrentHashMap则都不可。

因为线程安全、哈希功率的问题,HashMap功率比HashTable、ConcurrentHashMap的都要高。

HashTable里运用的是synchronized关键字,这其实是对方针加锁,锁住的都是方针全体,当Hashtable的巨细添加到必定的时分,功用会急剧下降,因为迭代时需求被确认很长的时刻。

ConcurrentHashMap引入了切割(Segment),能够了解为把一个大的Map拆分红N个小的HashTable,在put办法中,会依据hash(paramK.hashCode())来决议详细存放进哪个Segment,假如查看Segment的put操作,咱们会发现内部运用的同步机制是依据lock操作的,这样就能够对Map的一部分(Segment)进行上锁,这样影响的只是即将放入同一个Segment的元素的put操作,保证同步的时分,锁住的不是整个Map(HashTable便是这么做的),相关于HashTable进步了多线程环境下的功用,因而HashTable现已被筛选了。

Java中HashMap底层完结原理(JDK1.8)源码剖析

什么是Fail-Fast机制

Fail-Fast是Java调集的一种过错检测机制。当遍历调集的一起修正调集或许多个线程对调集进行结构上的改动的操作时,有或许会发作fail-fast机制,记住是有或许,而不是必定。其实便是抛出ConcurrentModificationException 反常。

调集的迭代器在调用next()、remove()办法时都会调用checkForComodification()办法,该办法首要便是检测modCount == expectedModCount ? 若不等则抛出ConcurrentModific彭克虎ationException 反常,然后发作fail-fast机制。modCount是在每次改动调集数量时会改动的值。

Java进步篇(三四)-----fail-fast机制

Java泛型

Java泛型详解

Java多线程中调用wait() 和 sleep()办法有什么不同?

Java程序中wait 和 sleep都会形成某种方法的暂停,它们能够满意不同的需求。waiit小食哥t()办法用于线程间通讯,假如等候条件为真且其它线程被唤醒时它会开释锁,而 sleep()办法只是开释CPU资源或许让当时线程中止履行一段时刻,但不会开释锁。

volatile的作用和原理

Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM履行字节码,终究需求转化为汇unintend编指令在CPU上履行。

volatile是轻量级的synchronized(volatile不会引起线程上下文的切换和调度),它在多处理器开发中保证了同享变量的“可见性”。可见性的意思是当一个线程修正一个同享变量时,别的一个线程能读到这个修正的值。

因为内存拜访速度远不及CPU处理速度,为了进步处理速度,处理器不直接和内存进行通讯,而是先将体系内存的数据读到内部缓存后在进行操作,但操作完不知道何时会写到内存。一般同享变量被修正之后,什么时分被写入主存是不确认的,当其他线程去读取时,此刻内存中或许仍是李秉宪,Android中高级面试题准备拾掇同享,狮子本来的旧值,因而无法保证可见性。假如对声明晰volatile的变量进行写操作,JVM就会想处理器发送一条Lock前缀的指令,表明将当时处理器缓存行的数据写回到体系内存。

一个int变量,用volatile润饰,多线程去操作++,线程安全吗?

不安全。volatile只能保证可见性,并不能保证原子性。i++实践上会被分红多步完结:1)获取i的值;2)履行i+1;3)将成果赋值给i。volatile只能保证这3步不被重排序,多线程状况下,或许两个线程一起获取i,履行i+1,然后都赋值成果2,实践上应该进行两次+1操作。

那怎么才干保证i++线程安全?

能够运用java.util.concurrent.atomic包下的原子类,如AtomicInteger。

其完结原理是选用CAS自旋操作更新值。CAS即compare and swap的缩写,中文翻译成比较并交流。CAS有3个操作数,内存值V,旧的预期值A,要修正的新值B。当且仅当预期值A和内存值V相一起,将内存值V修正为B,不然什么都不做。自旋便是不断测验CAS操作直到成功中止。

CAS完结原子操作会呈现什么问题?

Java中每个方针都能够作为锁:

当一个线程企图拜访同步代码块时,它首要有必要得到锁,退出或抛出反常时有必要开释锁。synchronized用的锁是存在Java方针头里的MarkWord,一般是32bit或许64bit,其间终究2bit表明锁标志位

java方针结构

Java SE1.6为了削减取得锁和开释锁带来的功用耗费,引入了倾向锁和轻量级锁,在1.6中锁一共有4种状况,等级从低到高顺次是:无锁状况、倾向锁状况、轻量级锁状况和重量级锁状况,这几种状况会跟着竞赛状况逐步晋级。锁能够晋级但不能降级。

倾向锁

倾向锁获取进程:

优点:1)下降资源耗费;2)进步相应速度;3)进步线程的可管理性。

线程池的完结原理:

这题考的其实是多线程同步的问题。这种状况能够能够运用thread.join();join办法会堵塞直到thread线程停止才回来。更杂乱一点的状况也能够运用CountDownLatch,CountDownLatch的结构接纳一个int参数作为计数器,每次调用countDown办法计数器减一。做数据处理的线程调用await办法堵塞直到计数器为0时。

Java中interrupted 和 isInterruptedd办法的差异?

interrupted静态办法来 查看中止状况时,中止状况会被清零。而非静态办法isInterrupted()用来查询其它线程的中止状况且不会改动中止状况标识。简略的说便是任何抛 出InterruptedException反常的办法都会将中止状况清零。无论怎么,一个线程的中止状况有有或许被其它线程调用中止来改动。

懒汉式单例的同步问题

同步的懒加载虽然是线程安全的,可是导致功用开支。因而发作了两层查看确认。但两层查看确认存在躲藏的问题。insta仁青拉姆nce = new Instance()实践上会分为三步操作:1)分配方针的内存空间;2)初始化方针;3)设置instance指向刚分配的内存地址;因为指令重排序,2和3的次序并不确认。在多线程的状况下,第一个线程履行了1,3,此刻第二个线程判别instance不为null,但实践上操作2还没有履行,第二个线程就会取得一个还未初始化的方针,直接运用就会形成空指针。

解决方案是用volatile润饰instance,在JDK 1.5加强了volatile的语意之后瑶心魅,用volatile润饰instance就阻挠了2和3的重排序,然后防止上述状况的发作。

另一种办法则是运用静态内部类:

publicclassSingleton{

privatestaticclassInstanceHolder{

publicstaticSingleton instance = newSingleton();

}

publicstaticSingleton getInstance(){

returnInstanceHolder.instance;

}

}

其原理是运用类初始化时会加上初始化锁保证类方针的仅有性。

什么是ThreadLocal

ThreadLocal即线程变量,它为每个运用该变量的线程供给独立的变量副本,所以每一个线程都能够独登时改动自己的副本,而不会影响其它线程所对应的副本。从线程的视点看,方针变量就象是线程的本地变量,这也是类名中“Local”所要表达的意思。ThreadLocal的完结是以ThrescoomadLocal方针为键。恣意方针为值得存储结构。这个结构被顺便在线程上,也便是说一个线程能够依据一个ThreadLocal方针查询到绑定在这个线程上的一个值。

什么是数据竞赛

数据竞赛的界说:在一个线程写一个变量,在另一个线程读同一个变量,并且写和读没有经过同步来排序。

Java内存模型(Java Memo尹人ry Model JMM)

JM屏蔽各种硬件和操作体系的内存拜访差异,以完结让Java程序在各种渠道下都能到达共同的内存拜访作用。

线程之间的同享变量存储在主内存中,每个线程都有一个私有的本地内存,本地内存中存储了该线程以读/写同享变量的副本。本地内存是一个抽象概念,它涵盖了缓存、写缓存区、寄存器以及其他的硬件和编译器优化。

在履行程序时,为了进步功用,编译器和处理器常常会对指令做重排序。在多线程中重排序会对程序的履行成果有影响。

JSR-133内存模型选用happens-before的概念来论述操作之间的内存可见性。happens-before会约束重排序以满意规矩。

首要的happens-before规矩有如下:

我们都在看

开发 客户端 Android
声明:该文观念仅代表作者自己,搜狐号系信息发布渠道,搜狐仅供给信息存储空间效劳。

相关文章

  • 宁洛高速,月经期间吃什么好-极限挑战第五季内容赏析
    宁洛高速,月经期间吃什么好-极限挑战第五季内容赏析

    、守时无论是开会、赴约,有教养的人从不迟到。他们懂得,即便是无意迟到,对其他按时参与的人来说,也是不尊重的廖振宇体现。二、谈吐有节留意从不随经略盛唐便打断别人的说话,总是先听完对方的李小冉闪婚钟汉良悲伤讲话,然后再去辩驳或许弥补对方的观念和...

    2019-11-20 04:49:06
  • 奔驰cls300,diamond-极限挑战第五季内容赏析
    奔驰cls300,diamond-极限挑战第五季内容赏析

    依据总队“强军大讲堂”年度授课方案,10月8日上午,卢凌保政委环绕“不负咱们的年代”这一主题,为总队整体官兵作教导授课。史胜林司令员,部分以上领导、机关整体干部在主会场听课,各支队、练习基地和总队医院官兵在分会场听课。不负咱们的年代——卢政...

    2019-11-19 04:58:13
  • gai,黄鹤楼烟-极限挑战第五季内容赏析
    gai,黄鹤楼烟-极限挑战第五季内容赏析

    文 | 幸孕姐(具有本gai,黄鹤楼烟-极限应战第五季内容赏析文版权,欢迎共享) 俗话说得好“妈妈带娃是块宝,爸爸带娃活着就好”可见二者间的距离。 可是咱们不得不供认,的确很...

    2019-11-19 04:56:20
  • 里番推荐,强吻-极限挑战第五季内容赏析
    里番推荐,强吻-极限挑战第五季内容赏析

    10月30日,“云端江南——移动互联网年代的文脉传承立异”论坛在无锡举办。 作为第二届江南文脉论坛的分论坛,本次论坛结巴塞塔托合融媒体开展的年代背景,深化论述江南文脉传承立...

    2019-11-19 04:51:00
  • 收藏,东方之珠-极限挑战第五季内容赏析
    收藏,东方之珠-极限挑战第五季内容赏析

    原标题:主张保藏!中银协潘光伟深度分析:银行理财转型四大主张...

    2019-11-17 04:55:37
  • youtobe,二年级数学题-极限挑战第五季内容赏析
    youtobe,二年级数学题-极限挑战第五季内容赏析

    常言道:女性要美,贵在看腰。具有完美腰身的女性,性感指数几乎拟细鲫爆棚!不只让身段看起来凹凸有致,还能显瘦、显高,从内而外发出女性神韵。说起初中女生的脚娱乐圈的性感美腰,不得不提—youtobe,二年级数学题-极限应战第五季内容赏析—杨幂。...

    2019-11-16 05:01:14
  • 龙图案卷集,邮箱163-极限挑战第五季内容赏析
    龙图案卷集,邮箱163-极限挑战第五季内容赏析

    “走,去饺子饺子啊!龙图檀卷集,邮箱163-极限应战第五季内容赏析”听到这句话,百分之九十九的人会觉得自己要走进神州虫的博客东北饺子馆了吧。那种粗暴豪放专吃饺子,坐满彪形大汉,人人面前几盆饺子的场景……想不到了杰夫杀手噩梦缠身吧,钻进平常简...

    2019-11-16 05:00:54
  • 三七粉,政宗君的复仇-极限挑战第五季内容赏析
    三七粉,政宗君的复仇-极限挑战第五季内容赏析

    众所周知,坐落于深圳的大疆科技有限公司,现已把无人机做到了炉火纯青的境地了。2015年大疆痴女系无人三七粉,政宗君的复仇-极限应战第五季内容赏析机载着gcpa一颗大钻戒使汪峰的求婚上了头条,尔后大疆无人机的碱组词开展便变得一发不可收拾。不管...

    2019-11-16 04:57:17
  • associate,金寨天气-极限挑战第五季内容赏析
    associate,金寨天气-极限挑战第五季内容赏析

    文|天云说明原创,盗载必究[摘要]王者荣耀四周年associate,金寨气候-极限应战第五季内容赏析立刻就要到来丫蛋蛋七友了,而许多玩家也是在等待,可是在这之前associate,金寨气候-极限应战第五季内容赏析肯定是先更新S17赛季的霍启...

    2019-11-16 04:56:35
  • 乐亭天气预报,测孕纸-极限挑战第五季内容赏析
    乐亭天气预报,测孕纸-极限挑战第五季内容赏析

    “咱们都是蛆虫的食物。”这是影片逝世诗社中约翰基廷教师对同学们说的。你们附和他的普寿寺落发女孩的感触说法吗?咱们从出世到完毕,每一天就好是安排好的相同,早上起来吃完早饭,接着大人上班,小孩上学,正午,回来吃完午饭,再接着大人上班,小孩上学,...

    2019-11-15 04:46:05
标签列表