CAS

字节跳动上千道精选面试题还不刷起来!2019-2020大厂高级面试题集合(Handler,性能优化,

亡梦爱人 提交于 2020-08-17 08:05:44
前言 本想今年辞掉工作大干一场,没想到碰到疫情,家里蹲了3个月...,还好字节能给一次机会。前阵子字节跳动的提前批开始了,看宣传是说有海量HC,机会多多,本着涨涨面经的心理,然后就投递了一下杭州那边的部门,首先在这里还要非常感谢内推我的小哥哥,非常热心的帮我跟踪进度,因为中间还出了一些小插曲(我投错部门了。。。),还是热心的小哥哥帮我联系HR,最后把我转到想要投递的部门了,我投的是Android开发工程师~面试项目大部分问题是围绕我的开源项目 蘑菇博客 展开的,还有就是我之前准备面试的一些 笔记(大佬请轻喷..) 面试时间 由于文章篇幅问题复制链接查看详细面试答案解析以及学习笔记链接: https://shimo.im/docs/QVGDhCjVKvQ6r6TJ 或者可以查看我的【 Github 】里可以查看 HR面完后,等了一个礼拜多,以为凉凉了,没想到收到惊喜,许愿成功~ 第一天:第一面 + 第二面 等了两天:第三面 + HR面 过了一周后:等来了意向书 第一面 面试官看起来很年轻,感觉是一个刚毕业不久的小伙汁,声音很青涩哈哈哈哈 开始面试的时候把我给问懵了,当时刚午觉睡醒,还没缓过神 计算机网络部分: 1.http的一套流程是什么? 2.https发起连接的流程是什么? 3.http请求的请求头中包含哪些字段?(这里忘了不少字段,只说了三四个,呜呜呜) 4

【012期】JavaSE面试题(十二):多线程(2)

早过忘川 提交于 2020-08-17 05:52:23
      2020年 百日百更 原创 Java面试题库之往期回顾    开篇介绍   大家好,我是 Java面试题库 的 提裤姐 ,今天这篇是JavaSE系列的第十二篇,主要总结了Java中的多线程问题,多线程分为三篇来讲,这篇是第二篇,在后续,会沿着第一篇开篇的知识线路一直总结下去,做到日更!如果我能做到 百日百更 ,希望你也可以跟着 百日百刷 ,一百天养成一个好习惯。    Q:    多线程的创建方式?   方式一:继承Thread类创建线程类    1 class T extends Thread{ 2 @Override 3 public void run() { 4 5 } 6 }   方式二:通过Runnable接口创建线程类    1 class T implements Runnable{ 2 @Override 3 public void run() { 4 5 } 6 }   方式三:通过Callable和Future创建线程    1 class T implements Callable { 2 @Override 3 public String call() throws Exception { 4 return null; 5 } 6 }    Q:    启动一个线程是调用 run() 方法还是 start() 方法?   启动一个线程是调用

Redis相关知识点汇总

情到浓时终转凉″ 提交于 2020-08-17 03:48:01
MongoDB和Redis有什么区别? 内存管理机制上: Redis 数据全部存在内存,定期写入磁盘,当内存不够时,可以选择指定的 LRU 算法删除数据 。 MongoDB 数据存在内存,由 linux系统 mmap 实现,当内存不够时,只将热点数据放入内存,其他数据存在磁盘 。 支持的数据结构上: Redis 支持的数据结构丰富 ,包括hash、set、list等。 MongoDB 数据结构比较单一,但是 支持丰富的数据表达,索引,最类似关系型数据库,支持的查询语言非常丰富 。 mysql引擎以及其区别 在Mysql数据库中,常用的引擎为 Innodb 和 MyIASM ,其中 Innodb是一个事务型的存储引擎,有行级锁定和外键约束,提供了对数据库ACID事物的支持,实现了SQL标准的四种隔离级别,即读未提交,不可重复读,可重复读以及串行,其涉及目标就是处理大数据容量的数据库系统 。 MyIASM引擎是Mysql默认的引擎,不提供数据库事务的支持,也不支持行级锁和外键,因此当写操作时需要锁定整个表,效率较低 。不过其保存了表的行数,当进行select count(*)form table时,可直接读取已经保存的值,不需要进行全表扫描。 因此当表的读操作远多于写操作,并且不需要事务支持时,可以优先选择MyIASM 。 Redis的定时机制怎么实现的 Redis服务器是一个

从jvm源码看synchronized

情到浓时终转凉″ 提交于 2020-08-17 03:47:45
synchronized的使用 synchronized关键字是Java中解决并发问题的一种常用方法,也是最简单的一种方法,其作用有三个:(1)互斥性:确保线程互斥的访问同步代码(2)可见性:保证共享变量的修改能够及时可见(3)有序性:有效解决重排序问题,其用法也有三个: 修饰实例方法 修饰静态方法 修饰代码块 修饰实例方法 public class Thread1 implements Runnable{ //共享资源(临界资源) static int i=0; //如果没有synchronized关键字,输出小于20000 public synchronized void increase(){ i++; } public void run() { for(int j=0;j<10000;j++){ increase(); } } public static void main(String[] args) throws InterruptedException { Thread1 t=new Thread1(); Thread t1=new Thread(t); Thread t2=new Thread(t); t1.start(); t2.start(); t1.join();//主线程等待t1执行完毕 t2.join();//主线程等待t2执行完毕 System.out

AQS

瘦欲@ 提交于 2020-08-17 03:47:06
jdk1.8版本 ReentantLock内部使用的是AQS,AQS的基础实现是CAS+Volatile; 调用lock方法,会调用Sync类中的lock()方法 public void lock() { sync .lock(); } Sync中的lock()方法,使用compareAndSetState final void lock() { if (compareAndSetState( 0 , 1 )) setExclusiveOwnerThread(Thread. currentThread ()); else acquire( 1 ); } 调用AbstractQueuedSynchronizer(AQS)中的compareAndSetState, protected final boolean compareAndSetState( int expect, int update) { // See below for intrinsics setup to support this return unsafe .compareAndSwapInt( this , stateOffset , expect, update); } 调用unsafa.compareAndSwapInt进入到static final class NonfairSync extends

深入探究JVM之对象创建及分配策略

风流意气都作罢 提交于 2020-08-17 00:46:51
@ 目录 前言 正文 一、对象的创建方式 二、对象的创建过程 对象在哪里创建 分配内存 对象的内存布局 三、对象的访问定位 四、判断对象的存活 对象生死 回收方法区 引用 对象的自我拯救 五、对象的分配策略 优先在Eden区分配 大对象直接进入老年代 长期存活的对象进入老年代 动态对象年龄判定 空间分配担保 总结 前言 Java是面向对象的语言,所谓“万事万物皆对象”就是Java是基于对象来设计程序的,没有对象程序就无法运行(8大基本类型除外),那么对象是如何创建的?在内存中又是怎么分配的呢? 正文 一、对象的创建方式 在Java中我们有几种方式可以创建一个新的对象呢?总共有以下几种方式: new关键字 反射 clone 反序列化 Unsafe.allocateInstance 为了便于说明和理解,下文仅针对new出来的对象进行讨论。 二、对象的创建过程 Java中对象的创建过程就包含上图中的5个步骤,首先需要验证待创建对象的类是否已经被JVM记载,如果没有则会先进行类的加载,如果已经加载则会在堆中(不完全是堆,后文会讲到)分配内存;分配完内存后则是对对象的成员变量设置初始值(0或null),这样对象在堆中就创建好了。但是,这个对象是属于哪个类的还不知道,因为类信息存在于方法区,所以还需要设置对象的头部(当然头部中也不仅仅只有类型指针信息,稍后也会详细讲到),这样堆中才创建好了一个

《Java多线程编程实战指南》笔记(一)多线程编程基础

瘦欲@ 提交于 2020-08-16 16:36:06
文章目录 一、多线程基础知识 1.1 线程的创建、启动与运行 1.2 Runnable接口 1.3 线程属性 1.4 Thread类的常用方法 1.5 线程的层次关系 1.6 线程的生命周期状态 1.7 多线程下载的小例子 1.8 多线程编程的优势和风险 二、多线程竟态与特性 2.1 串行、并发与并行 2.2 竟态 2.3 原子性 2.4 可见性 2.5 有序性 2.5.1 指令重排序 2.5.2 存储子系统重排序 2.5.3 貌似串行语义 2.6 上下文切换 一、多线程基础知识   进程是程序向操作系统申请资源(如内存空间和文件句柄)的基本单位。线程是进程中可独立执行的最小单位。   一个进程可以包含多个线程。同一个进程中所有线程共享该进程的资源,如内存空间、文件句柄等。线程所要完成的计算就被称为任务。特定的线程总是在执行特定的任务。   函数式编程中的函数是基本抽象单位,面向对象编程中的类是基本抽象单位,相应地,多线程编程就是以线程为基本抽象单位的一种编程范式。当然,多线程编程和面向对象编程是兼容的,事实上Java平台中的一个线程就是一个对象。 1.1 线程的创建、启动与运行   在Java中创建一个线程就是创建一个Thread类(或其子类)的实例。线程的任务处理逻辑可以在Thread类的run实例方法中直接实现或通过该方法进行调用

常见并发编程面试题

两盒软妹~` 提交于 2020-08-16 03:47:39
1、在 java 中守护线程和用户线程的区别? java 中的线程分为两种:守护线程( Daemon )和用户线程( User )。 任何线程都可以设置为守护线程和用户线程,通过方法 Thread.setDaemon(bool on) ; true 则把该线程设置为守护线程,反之则为用户线 程。 Thread.setDaemon() 必须在 Thread.start() 之前调用,否则运行时会抛出异常。 两者的区别: 唯一的区别是判断虚拟机 (JVM) 何时离开, Daemon 是为其他线程提供服务, 如果全部的 User Thread 已经结束, Daemon 没有可服务的线程, JVM 关闭。 扩展: Thread Dump 打印出来的线程信息,含有 daemon 字样的线程即为守 护进程 2、线程与进程的区别? 进程是操作系统分配资源的最小单元,线程是操作系统调度的最小单元。 一个程序至少有一个进程 , 一个进程至少有一个线程。 3、什么是多线程中的上下文切换? 多线程会共同使用一组计算机上的 CPU ,而线程数大于给程序分配的 CPU 数量时,为了让各个线程都有执行的机会,就需要轮转使用 CPU 。不同的线程切 换使用 CPU 发生的切换数据等就是上下文切换。 4、死锁与活锁的区别,死锁与饥饿的区别? 死锁:是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而

深入探究JVM之对象创建及分配策略

北战南征 提交于 2020-08-16 00:10:56
@ 目录 前言 正文 一、对象的创建方式 二、对象的创建过程 对象在哪里创建 分配内存 对象的内存布局 三、对象的访问定位 四、判断对象的存活 对象生死 回收方法区 引用 对象的自我拯救 五、对象的分配策略 优先在Eden区分配 大对象直接进入老年代 长期存活的对象进入老年代 动态对象年龄判定 空间分配担保 总结 前言 Java是面向对象的语言,所谓“万事万物皆对象”就是Java是基于对象来设计程序的,没有对象程序就无法运行(8大基本类型除外),那么对象是如何创建的?在内存中又是怎么分配的呢? 正文 一、对象的创建方式 在Java中我们有几种方式可以创建一个新的对象呢?总共有以下几种方式: new关键字 反射 clone 反序列化 Unsafe.allocateInstance 为了便于说明和理解,下文仅针对new出来的对象进行讨论。 二、对象的创建过程 Java中对象的创建过程就包含上图中的5个步骤,首先需要验证待创建对象的类是否已经被JVM记载,如果没有则会先进行类的加载,如果已经加载则会在堆中(不完全是堆,后文会讲到)分配内存;分配完内存后则是对对象的成员变量设置初始值(0或null),这样对象在堆中就创建好了。但是,这个对象是属于哪个类的还不知道,因为类信息存在于方法区,所以还需要设置对象的头部(当然头部中也不仅仅只有类型指针信息,稍后也会详细讲到),这样堆中才创建好了一个

ConcurrentHashMap 源码分析

大兔子大兔子 提交于 2020-08-15 21:37:08
和 HashMap 不同的是, ConcurrentHashMap 采用分段加锁的方式保障线程安全 ,JDK 1.8 之后,ConcurrentHashMap 的底层数据结构从 1.8 开始跟 HashMap 差不多。 HashTable 也是线程安全的,存储 Key-Value 键值对的数据结构, Key 和 Value 都不能为空,但不推荐使用,因为其所有的方法采用 synchronized 修饰,效率低。 Key 和 Value 都不能为 Null 的原因是:如果 map.get(key) 返回 null,可以认为是 value 的值本来就是 null,也可以认为 map 中不存在 key 的存储数据, 因此具有二义性 ,但 HashMap 在单线程环境,可以通过 map.containsKey(key) 判断,消除而已性。 但在多线程环境中,map.get(key) 和 map.containsKey(key) 是非原子的操作,可能在线程 A 的两个语句运行之间,其他线程 B 运行 map.put(key,value), 导致线程 A 无法消除上面的二义性 。 参考 https://www.cnblogs.com/thisiswhy/p/12059240.html 下图是 ConcurrentHashMap 的 UML 关系图。 1、底层存储结构 1.1、JDK 1.7