字节-Android开发面经(九)
共 3193字,需浏览 7分钟
·
2021-06-12 08:40
点击蓝字关注我们,获取更多面经
public final class ThreadSafeSingleton {
private static ThreadSafeSingleton singObj = null;
private ThreadSafeSingleton() {
}
public static Synchronized ThreadSafeSingleton getSingleInstance() {
if (null == singObj ) {
singObj = new ThreadSafeSingleton();
}
return singObj;
}
}
双重检查锁(Double-Checked Lock)
public final class DoubleCheckedSingleton {
private static DoubleCheckedSingletonsingObj = null;
private DoubleCheckedSingleton() {
}
public static DoubleCheckedSingleton getSingleInstance() {
if (null == singObj ) {
Synchronized(DoubleCheckedSingleton.class) {
if (null == singObj) {
singObj = new DoubleCheckedSingleton();
}
}
}
return singObj;
}
}
volatile原理:
被volatile关键字修饰的变量,编译器与运行时都会注意到这个变量是共享的,因此不会将该变量上的操作与其他内存操作一起重排序。volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取volatile类型的变量时总会返回最新写入的值。
在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比sychronized关键字更轻量级的同步机制。当对非 volatile 变量进行读写的时候,每个线程先从内存拷贝变量到CPU缓存中。如果计算机有多个CPU,每个线程可能在不同的CPU上被处理,这意味着每个线程可以拷贝到不同的 CPU cache 中。
而声明变量是 volatile 的,JVM 保证了每次读变量都从内存中读,跳过 CPU cache 这一步。
volatile在Java并发编程中常用于保持内存可见性和防止指令重排序。内存可见性(Memory Visibility):所有线程都能看到共享内存的最新状态;防止指令重排:在基于偏序关系的Happens-Before内存模型中,指令重排技术大大提高了程序执行效率,但同时也引入了一些问题。
可见性:
volatile保持内存可见性的特殊规则:read、load、use动作必须连续出现;assign、store、write动作必须连续出现;每次读取前必须先从主内存刷新最新的值;每次写入后必须立即同步回主内存当中。
也就是说,volatile关键字修饰的变量看到的随时是自己的最新值。在线程1中对变量v的最新修改,对线程2是可见的。
内存屏障:
volatile防止指令重排的策略:在每个volatile写操作的前面插入一个StoreStore屏障;在每个volatile写操作的后面插入一个StoreLoad屏障;在每个volatile读操作的后面插入一个LoadLoad屏障;在每个volatile读操作的后面插入一个LoadStore屏障。
volatile 性能:
volatile 的读性能消耗与普通变量几乎相同,但是写操作稍慢,因为它需要在本地代码中插入许多内存屏障指令来保证处理器不发生乱序执行。
生成APK遇到两个问题:一是生成的APK安装失败(没有勾选V1所致),二是生成APK后,百度与谷歌地图不显示(SHA1值改变所致)。
通过Build>Generate Signed APK生成APK包
1.如果没有勾选V1(Jar Signature) 选项,生成的APK无法安装
2.build.gradle文件中添加以下代码
lintOptions{
checkReleaseBuilds false
abortOnError false
}
否则生成APK报错
3.不要引重复的jar包,否则也是无法生成的。
4.如果用到了百度或谷歌地图。生成APK后,SHA1值变了,需要将生成的APK解压并找到META-INF/CERT.RSA文件
执行命令keytool -printcert -file CERT.RSA得到生成APK后的SHA1值,重新生成key。
5.得到SHA1值的方法:在.android文件夹下执行keytool -list -v -keystore debug.keystore命令 输入密钥库口令 android
6.得到生成APK后SHA1值的方未能:keytool -printcert -file CERT.RSA
校验和:
发送的数据包的二进制相加然后取反,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段。
确认应答+序列号(累计确认+seq):
接收方收到报文就会确认(累积确认:对所有按序接收的数据的确认)
TCP给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。
超时重传:
当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
流量控制:
TCP连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP使用的流量控制协议是可变大小的滑动窗口协议。
接收方有即时窗口(滑动窗口),随ACK报文发送
拥塞控制:
当网络拥塞时,减少数据的发送。
发送方有拥塞窗口,发送数据前比对接收方发过来的窗口,取小
慢启动、拥塞避免、拥塞发送、快速恢复
应用数据被分割成TCP认为最适合发送的数据块。
TCP的接收端会丢弃重复的数据
更多面经
扫描二维码
获取更多面经
扶摇就业