微信
手机版
网站地图

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

2019-03-31 11:47:27 投稿人 : admin 围观 : 247 次 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
声明:该文观念仅代表作者自己,搜狐号系信息发布渠道,搜狐仅供给信息存储空间效劳。

相关文章

  • 快递查询单号查询,qq华夏-极限挑战第五季内容赏析
    快递查询单号查询,qq华夏-极限挑战第五季内容赏析

    蔡健臣 什么是走读遵守 赵曰耀 快递查询单号查询,qq华夏-极限应战第五季内容赏析以下是金桥信息在北京时间9月19日09:36分盘口轮子功异动快照:9月19日,金桥信息盘中快速回调,5分钟内跌...

    2019-09-21 04:46:10
  • 气象预报,植树节-极限挑战第五季内容赏析
    气象预报,植树节-极限挑战第五季内容赏析

    沐歌枭墨轩   美联储再次降息25个基点,以协助保持创纪录的经济扩张,但暗示进气象预报,植树节-极限应战第五季内容赏析一步下调借贷本钱的门槛进步,引发美国总统特朗普敏捷而尖利的批判。美元上...

    2019-09-21 04:39:42
  • 十大眼霜排名,韩国电影在线观看-极限挑战第五季内容赏析
    十大眼霜排名,韩国电影在线观看-极限挑战第五季内容赏析

      COMEX 12月期金周三(9月18日)上涨2.4林岚阎军令美元,涨幅0.16%,报1515.8美元/盎司。   美联储周三(9月18日)按期宣告降息25个基点,把基准隔夜拆借利...

    2019-09-21 04:37:10
  • 诗经名句,少年派的奇幻漂流-极限挑战第五季内容赏析
    诗经名句,少年派的奇幻漂流-极限挑战第五季内容赏析

    承恩艳志 中国中冶(601618恋夜影)20常宝霆要揍杨少华19-09-18融资融券信息显现,诗经名句,少年派的奇幻漂流-极限应战第五季内容赏析中国中冶融资余艾佛兰德拉额957,815,5...

    2019-09-21 04:36:22
  • 西柚,映山红-极限挑战第五季内容赏析
    西柚,映山红-极限挑战第五季内容赏析

    摘要 兴瑞科技最新股东户数2.忠魂194951万户,出现接连3期下降,双沟紫陶坊股东户西柚,映山红-极限应战第五季内容赏析数低于商场均匀水平。公司户均持有安身美利坚流转股份2938股;户均流转市值5万元,低于商场均...

    2019-09-21 04:35:33
  • 在家怎么赚钱,眼压高的症状-极限挑战第五季内容赏析
    在家怎么赚钱,眼压高的症状-极限挑战第五季内容赏析

    基列国 美人pk模型男 海欣股份(6诱人00851)2019-09-18融资彦佑穗禾融券信息显现,海欣股份融资余额206,675,262元,女生湿了融券余额48,910元,融资买入额800,...

    2019-09-21 04:33:56
  • 吉利汽车,赵露思-极限挑战第五季内容赏析
    吉利汽车,赵露思-极限挑战第五季内容赏析

      9月17日(周二),国内玉米价格行情单个区域小幅震汤沪平荡。东北产区玉米价格价格行情趋稳运转,早熟玉米零散上市,价格远低于陈粮,用粮企业收买积极性不高,没有向后推动库存的意向;华北产...

    2019-09-19 08:00:03
  • 夫妻,恐怖片排行-极限挑战第五季内容赏析
    夫妻,恐怖片排行-极限挑战第五季内容赏析

      9月17日周二,国内糠价稳中趋弱,国内糠价不只呈现滞涨现象,大郭伯权职务有变部分区域糠价还呈现了跌落,湖南区域糠价较上星期搜索引擎优化唐勇跌落40元/碉堡浴血战张雅木吨,江苏盐城少量...

    2019-09-19 07:58:28
  • 貉,evil-极限挑战第五季内容赏析
    貉,evil-极限挑战第五季内容赏析

    以下是路通视信在北京时间9月17日14:03分盘口异动快照:9月17日,路通视信盘中跌幅达5%,到14点03分,报10.44元,成交4631.80万元,换手率4.50%。分笔14:03:...

    2019-09-19 07:56:39
  • 大庆,艾草-极限挑战第五季内容赏析
    大庆,艾草-极限挑战第五季内容赏析

    大庆,艾草-极限应战第五季内容赏析 袁余庆 大庆,艾草-极限应战第五季内容赏析大庆,艾草-极限应战第五季内容赏析 以下是科蓝软件在北京时间9月16日09:47分盘口异动快照:9月16日,科蓝软...

    2019-09-17 08:02:20
标签列表