java面试

来源:互联网 发布:android 与js交互 编辑:程序博客网 时间:2024/06/06 03:13

Atomic的实现原理:

在这里采用了CAS操作,每次从内存中读取数据然后将此数据和+1后的结果进行CAS操作,如果成功就返回结果,否则重试直到成功为止。

/**

 * 一,AtomicInteger 是如何实现原子操作的呢?

 *

 * 我们先来看一下getAndIncrement的源代码:

 *    public final int getAndIncrement() {

 *        for (;;) {

 *          int current = get();  // 取得AtomicInteger里存储的数值

 *            int next = current + 1;  // 加1

 *            if (compareAndSet(current, next))   // 调用compareAndSet执行原子更新操作

 *                return current;

 *        }

 *    }

 *

 * 这段代码写的很巧妙:

 * 1,compareAndSet方法首先判断当前值是否等于current;

 * 2,如果当前值 = current ,说明AtomicInteger的值没有被其他线程修改;

 * 3,如果当前值 != current,说明AtomicInteger的值被其他线程修改了,这时会再次进入循环重新比较;

 *    

 * 注意这里的compareAndSet方法,源代码如下:

 * public final boolean compareAndSet(int expect, int update) {

 *     return unsafe.compareAndSwapInt(this, valueOffset, expect, update);

 * }

 *

 * 调用Unsafe来实现

 * private static final Unsafe unsafe = Unsafe.getUnsafe();

 *

 * 二,java提供的原子操作可以原子更新的基本类型有以下三个:

 *

 * 1,AtomicBoolean

 * 2,AtomicInteger

 * 3,AtomicLong

 *

 * 三,java提供的原子操作,还可以原子更新以下类型的值:

 *

 * 1,原子更新数组,Atomic包提供了以下几个类:AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray

 * 2,原子更新引用类型,也就是更新实体类的值,比如AtomicReference<User>

 * AtomicReference:原子更新引用类型的值

 * AtomicReferenceFieldUpdater:原子更新引用类型里的字段

 * AtomicMarkableReference:原子更新带有标记位的引用类型

 * 3,原子更新字段值

 * AtomicIntegerFieldUpdater:原子更新整形的字段的更新器

 * AtomicLongFieldUpdater:原子更新长整形的字段的更新器

 * AtomicStampedReference:原子更新带有版本号的引用类型的更新器

 *

 *

 */

进程间通信使用方法

# 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
# 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
# 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
# 消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
# 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
# 共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
# 套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。

 

java的重载实现原理

 

list,set,map是否都继承了collection 

Collection 接口 :Collection是最基本的集合接口,声明了适用于JAVA集合(只包括Set和List)的通用方法。 Set 和List 都继承了Conllection,Map

TreeSet与 TreeMap

TreeMap:

无序,不允许重复(无序指元素顺序与添加顺序不一致) 

TreeMap集合默认会对键进行排序,所以键必须实现自然排序和定制排序中的一种 
底层使用的数据结构是二叉树

TreeSet:

TreeSet:

根据构造方法的不用,选择使用自然排序或者比较器排序。 
按照实际的需求,可以对元素进行排序。并且保证唯一。

怎么保证的呢

排序:底层结构是二叉树。按照树节点进行存储和取出。 

两种实现: 
A:自然排序(元素具备比较性) TreeSet的无参构造,要求对象所属的类实现Comparable接口。 
B:比较器排序(集合具备比较性) TreeSet的带参构造,要求构造方法接收一个实现了Comparator接口的对象。 唯一:根据返回值是否为0。 

注意: 
如果同时有两种方案,以谁为主呢?以比较器为主,以比较器排序为主

方式一对存进集合的对象所属的类实现Comparable接口,进行自然排序

方式二TreeSet的带参构造,要求构造方法接收一个实现了Comparator接口的对象。

NIO使用:

java非阻塞式IO,可以了解了解netty,java本身这个开发难度大;

GC,JVM

 

使用的一些技术kafka,rocketmq;中间遇到的一些问题,以及解决方法;和为什么要使用这个技术;

 

Redis分布式数据分布解决方式,数据迁移;

 

谈谈公司业务,系统架构;

 

java多线程;为什么使用线程池,线程池实现原理

 

异常处理,什么境况下会导致堆异常,内存异常等;聊聊一些异常的处理;为什么异常不全部使用try/catch;使用try/catch为什么会有性能影响

 

 

线程间同步方式,以及锁的多种实现方式以及区别

 

Wait与sleep的区别

 

谈谈java.util.concurrent,以及一些实现原理

 

shell脚本,linux命定

 

Switch case:里面一般使用说明类型的值,string行不行,为什么

 

Mysql连接数不够解决方式,代码层,与系统层


谈谈设计模式,spring中使用的设计模式,以及实现方式


代码一致性锁,分布式锁,mysql的行锁的实现方式与锁的作用


谈谈soa架构,


谈谈dubbo


谈一谈mysql的主从复制原理


谈一谈redis分布式服务


谈一谈自己所在公司的系统架构,业务实现




原创粉丝点击