本来是现场面,但是太远了,来回得快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分布式锁
一定要注重项目,去看项目代码,看不懂也要硬着头皮看
项目是只要面试都会问的一块,项目参与程度和熟悉程度很大程度影响了面试的结果,谨记!
转载请注明:汪明鑫的个人博客 » 同程艺龙二面 视频面试
说点什么
您将是第一位评论人!