Welcome everyone

同程艺龙二面 视频面试

面试 汪明鑫 573浏览 0评论

本来是现场面,但是太远了,来回得快5个小时,我就和hr商量改成了视频面试。

 

1,自我介绍

2,值传递和引用传递

3,A有2个用synchronized的方法B( ) 和方法 C( ),两个线程分别调用B和C可以执行吗

 

当然可以,synchronized修饰在2个方法上,且调用的方法不同,不会产生互斥

 

如果调用同一个方法呢?会产生互斥吗?我自己下来写了个demo:

/**
 * @author: wangmingxin1
 * @create: 2018-11-22 15:17
 **/
public class SynchronizedDemo {
    public static void main(String[] args){
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("t1 执行方法B...");
                new A().B();
            }
        });

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("t2 执行方法B...");
                new A().B();
            }
        });

        t1.start();
        t2.start();
    }
}

class A{
    public synchronized void B(){
        System.out.println("pers.wmx.demo.A.B");

        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName()+" i=" + i);
        }
    }

    public synchronized void C(){
        System.out.println("pers.wmx.demo.A.C");

        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName()+" i=" + i);
        }
    }

}

最开始这样写我以为2个线程调用同一个被synchronized修饰的方法会发生互斥,然而运行结果却不是互斥的。

 

运行结果:

 

显然没有发生互斥,为什么会产生这样的结果呢?

new A().B();

是由于这一句代码,我每次都new了一个新对象调用了方法,不同的对象的方法当然是不同的方法,所以没有产生互斥

 

我们稍微修改下代码:

/**
 * @author: wangmingxin1
 * @create: 2018-11-22 15:17
 **/
public class SynchronizedDemo {
    public static void main(String[] args){

        A a = new A();

        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("t1 执行方法B...");
                a.B();
            }
        });

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("t2 执行方法B...");
                a.B();
            }
        });

        t1.start();
        t2.start();
    }
}

class A{
    public synchronized void B(){
        System.out.println("pers.wmx.demo.A.B");

        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName()+" i=" + i);
        }
    }

    public synchronized void C(){
        System.out.println("pers.wmx.demo.A.C");

        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName()+" i=" + i);
        }
    }

}

只创建一个A的对象,就会产生互斥

这里算是一个小陷阱。

 

运行结果:

 

3,HashMap相关

HashMap存储结构
put时,如果key不相等,hash值相等,会怎么插入该节点

 

4,说下在网易的技术的提升和收获

5,网易新闻项目

6,redis实现新闻推送幂等性

 

面试官:会redis吗,应用场景,在你们项目里哪用到了。

我:我记得有个同事给我说个幂等性这一块,说是存在redis里,每次推送文章前,先查redis。我就说了个幂等性。

我:不知道咋存的,我就随便编了个用docId_deviceId(文章id和设备号拼成字符串当做唯一识别存在redis),意思是给一个设备只能推送一篇文章一次,不能重复推送

面试官:那这样存有什么缺陷

我:懵逼中 ….

面试官: 如果让你用redis,你会怎么设计解决幂等性

我:一脸懵逼 。。。 当时视频面试,都不敢看面试官了,心虚。。。

 

今早来公司问导师幂等性这一块,导师说不能使用docId_deviceId

比如说,一篇直播的文章,可能直播前会推送给用户,直播中也会多次推送给用户,这样存储就行不通了

导师说Kafka解决不了消息的幂等性,需要自己定义唯一标识,用每次推送任务的taskId来做唯一key

 

 

7,zookeeper分布式锁

 

一定要注重项目,去看项目代码,看不懂也要硬着头皮看

项目是只要面试都会问的一块,项目参与程度和熟悉程度很大程度影响了面试的结果,谨记!

 

转载请注明:汪明鑫的个人博客 » 同程艺龙二面 视频面试

喜欢 (0)

说点什么

您将是第一位评论人!

提醒
avatar
wpDiscuz