2019面试

2019-04-19  本文已影响0人  Maxwell_cz

和信贷面试

HashMap的hash是如何计算的? 负载因子是什么?什么时候rehash的?

  static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }

Java 左移运算 << ,丢弃最高位,0补最低位;带符号右移运算 >> 符号位不变,左边补上符号位;无符号右移运算 >>> 忽略了符号位扩展,0补最高位

^ 是异或运算符。如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0

ConcurrentHashMap是如何实现多线程安全的呢?

ReentrantLock 的实现原理

分布式锁的实现方式

redis 实现原理 (技术总监面)

Mysql (技术总监面)

火花思维面试

手写代理模式(技术总监面)

dubbo 一次request发送完毕之后,如何获取相应结果的 (技术总监面,他说dubbo请求一个请求拿到结果之后下一个才能发送请求)

这行代码的调用如上,可以看到dubbo client 组装了请求参数之后,就通过 `

这行代码的调用如上,可以看到dubbo client 组装了请求参数之后,就通过`DefaultFuture.newFuture(channel, req, timeout)` 构造了一个DefaultFuture 。通过 channel将请求`send`即返回。这里并没有拿到response 。但是在返回`DefaultFuture`之后,在`dubbo org.apache.dubbo.rpc.protocol.dubbo.ChannelWrappedInvoker#doInvoke `中的 `currentClient.request(inv)`拿到`DefaultFuture`之后即调用`get`方法返回了RPC请求的结果。

```java
if (timeout <= 0) {
            timeout = Constants.DEFAULT_TIMEOUT;
        }
        if (!isDone()) {
            long start = System.currentTimeMillis();
            lock.lock();
            try {
                while (!isDone()) {
                    done.await(timeout, TimeUnit.MILLISECONDS);
                    if (isDone() || System.currentTimeMillis() - start > timeout) {
                        break;
                    }
                }
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            } finally {
                lock.unlock();
            }
            if (!isDone()) {
                throw new TimeoutException(sent > 0, channel, getTimeoutMessage(false));
            }
        }
        return returnFromResponse();
```

get的实际逻辑如上,线程在请求参数发送出去之后即进入while循环中进行阻塞等待,通过设置阻塞等待的时间,如果超过指定时间服务端还没有相应结果则会跳出循环,抛出超时异常。如果在timeout时间范围内RPC响应结果返回,则 有如下代码

```java
private void doReceived(Response res) {
        lock.lock();
        try {
            response = res;
            done.signalAll();
        } finally {
            lock.unlock();
        }
        if (callback != null) {
            invokeCallback(callback);
        }
    }
```

此时将会唤醒前面`get` 方法 while中的线程阻塞, 将结果返回。这就是一个请求响应的过程。

## redis 集群的几种实现方式(技术总监面)

> 这个问题回答的不是很好,只是简单的说是通过 redisClient 来实现的客户端分片,redis集群互相不感知。然后被问到当集群中有一台挂了会有什么样的结果时,就说到了一致性hash。当问挂了的数据对线上的操作造成影响时怎么办,然后回答说通过redis一主一丛。但是这个问题大体上来回回答的不是特别好。应当明确redis实现集群的几种方式(客户端分片,redis 原生cluster等),实现原理,`故障应对策略`等。

##  

# 惠金所面试(技术一面)

两个排序的数组merge到一个大的数组里。手写代码

业务场景测试 (线上活动7天,给一个文件,里面有n(百万级别)的活动码,用户若想获取奖品,就必须提将指定的活动码传递到服务器,一个用户只能获取一个奖品)

上一篇 下一篇

猜你喜欢

热点阅读